一、基础知识
1.1 restful
REST(Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP、URI、XML、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新的架构风格(一种思想)。
全称:Resource Representational State Transfer
Resource:资源,即数据(前面说过网络的核心)。比如 newsfeed,friends等;
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP动词实现。
1.2 REST基础概念
- 在REST中的一切都被认为是一种资源。
- 每个资源由URI标识。
- 使用统一的接口。处理资源使用POST,GET,PUT,DELETE操作类似创建,读取,更新和删除(CRUD)操作。
- 无状态。每个请求是一个独立的请求。从客户端到服务器的每个请求都必须包含所有必要的信息,以便于理解。
- 通信都是通过展现。例如XML,JSON
1.3 REST原则
围绕资源展开讨论,从资源的定义、获取、表述、关联、状态变迁等角度。
RESTful架构的主要原则
- 对网络上所有的资源都有一个资源标志符。
- 对资源的操作不会改变标识符。
- 同一资源有多种表现形式(xml、json)
- 所有操作都是无状态的(Stateless)
简单的说:RESTful是一种架构的规范与约束、原则,符合这种规范的架构就是RESTful架构。
1.4 统一接口
RESTful 架构的核心规范与约束:统一接口
分为四个子约束:
- 每个资源都拥有一个资源标识,每个资源的资源标识可以用来唯一地标明该资源
- 消息的自描述性
- 资源的自描述性。
- HATEOAS Hypermedia As The Engine Of Application State(超媒体作为应用状态引擎)
RESTful中根据操作资源的不同,使用不同的http方法,其传输的媒介一般使用json。
(1)对于资源的具体操作类型,由HTTP动词表示:
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源
GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
(2)api 过滤信息
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
1.5 restful应用
随着移动互联网的发展,客户端层出不穷,app,web,微信端等等,而后端业务逻辑基于是一致的,如何做到业务逻辑“一次编写,随时接入”?答案是通过远程调用API,而目前比较火的方案是“Restful api”。简单来说,RESTful API 是基于HTTP协议产生的一种相对简单的API设计方案,属于无状态传输。各种类型的Client层出不穷,RESTful可以通过一套统一的接口为 Web,iOS和Android提供服务
2 C++ 实现Restful
实践内容以github 的案例为准:
https://github.com/eidheim/Simple-Web-Server
2.1 简介
A very simple, fast, multithreaded, platform independent HTTP and HTTPS server and client library implemented using C++11 and Asio (both Boost.Asio and standalone Asio can be used). Created to be an easy way to make REST resources available from C++ applications.
Features
- Asynchronous request handling
- Thread pool if needed
- Platform independent
- HTTPS support
- HTTP persistent connection (for HTTP/1.1)
- Client supports chunked transfer encoding
- Timeouts, if any of Server::timeout_request and Server::timeout_content are >0 (default: Server::timeout_request=5 seconds, and Server::timeout_content=300 seconds)
- Simple way to add REST resources using regex for path, and anonymous functions
2.2 编译运行
2.2.1下载并解压测试用例
unzip Simple-WebSocket-Server-master.zip
2.2.2 安装并配置依赖库
Dependencies
- Boost.Asio or standalone Asio
- Boost is required to compile the examples
- For HTTPS: OpenSSL libraries
(1)安装并配置boost 库
- 下载boost 库
https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.gz
- 安装依赖环境
yum -y install gcc gcc-c++ libicu libicu-devel zlib zlib-devel bzip2 bzip2-devel
centos 中默认安装了python ,只安装 phthon-devel
yum install python36-devel
- 进入解压出的boost目录,执行./bootstrap.sh编译boost库;
- 执行./b2 install安装;
- 刷新链接库
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。ldconfig
- 编写测试boost库是否安装成功
#include <string>
#include <iostream>
#include <boost/version.hpp> //包含Boost头文件
#include <boost/config.hpp> //包含Boost头文件
using namespace std;
int main()
{
std::cout << BOOST_VERSION << endl;
std::cout << "hello" <<std::endl;
}
编译连接 g++ boost_test.cpp -o test,并运行,如下所示boost 库安装成功。
(2)安装OpenSSL 库
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
yum install openssl
yum install openssl-devel
2.2.3 编译运行
Compile and run
Compile with a C++11 compliant compiler:
mkdir build
cd build
cmake ..
make
cd ..
编译连接如下:
编译运行:
参考文献:
【1】理解RESTful架构:http://www.ruanyifeng.com/blog/2011/09/restful.html
【2】RESTful 架构详解: https://www.runoob.com/w3cnote/restful-architecture.html
【3】RESTful到底是什么:https://www.cnblogs.com/zhangruifeng/p/13257731.html
【4】restful api 实战:https://www.imooc.com/learn/811/
【5】怎样用通俗的语言解释REST,以及RESTful?:https://www.zhihu.com/question/28557115/answer/48094438
【6】如何给老婆通俗讲restful: https://zhuanlan.zhihu.com/p/30396391
【7】RESTful API 设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
【8】Restbed - C++11 异步RESTful框架:https://www.ctolib.com/restbed.html
【9】pastache: http://pistache.io
【10】postman+linux+pistache的http通信过程:https://www.bbsmax.com/A/QW5YV4RKdm/
【11】RESTFUL API Server in C++:
https://blog.csdn.net/ztguang/article/details/51509095
https://github.com/eidheim/Simple-Web-Server
【12】CentOS下安装boost库:https://blog.csdn.net/WilliamFu95/article/details/94664460