艾辰做网站,网站悬浮广告素材,wordpress电子书,网站做公司简介怎么做cpp-httplib 1. 介绍2. 安装3. 类与接口3.1 httplib请求3.2 httplib响应3.3 httplib服务端3.4 httplib客户端 4. 使用4.1 服务端4.2 客户端 1. 介绍
C HTTP 库#xff08;cpp-httplib#xff09;是一个轻量级的 C HTTP 客户端/服务器库#xff0c;它提供了简单的 API 来创建… cpp-httplib 1. 介绍2. 安装3. 类与接口3.1 httplib请求3.2 httplib响应3.3 httplib服务端3.4 httplib客户端 4. 使用4.1 服务端4.2 客户端 1. 介绍
C HTTP 库cpp-httplib是一个轻量级的 C HTTP 客户端/服务器库它提供了简单的 API 来创建 HTTP 服务器和客户端支持同步和异步操作。这种第三方网络库可以让我们免去搭建服务器或客户端的时间把更多的精力投入到具体的业务处理中提高开发效率。以下是一些关于cpp-httplib 的主要特点
轻量级cpp-httplib 的设计目标是简单和轻量只有一个头文件包含即可不依赖于任何外部库。跨平台它支持多种操作系统包括 Windows、Linux 和 macOS。同步和异步操作库提供了同步和异步两种操作方式允许开发者根据需要选择。支持 HTTP/1.1它实现了 HTTP/1.1 协议包括持久连接和管道化。Multipart form-data支持发送和接收 multipart/form-data 类型的请求这对于 文件上传非常有用。SSL/TLS 支持通过使用 OpenSSL 或 mbedTLS 库cpp-httplib 支持 HTTPS 和 WSS。简单易用API 设计简洁易于学习和使用。性能尽管是轻量级库但性能表现良好适合多种应用场景。社区活跃cpp-httplib 有一个活跃的社区不断有新的功能和改进被加入。
2. 安装
git clone https://github.com/yhirose/cpp-httplib.git3. 类与接口
3.1 httplib请求
namespace httplib
{// 文件信息结构体struct MultipartFormData{std::string name; // 字段名称std::string content; // 文件内容std::string filename; // 文件名称std::string content_type; // 文件类型};using MultipartFormDataItems std::vectorMultipartFormData;struct Request{std::string method;//请求方法std::string path;//请求资源路径Headers headers;//请求报头std::string body;//请求正文Params params;//查询字符串MultipartFormDataMap files;//保存的是客户端上传的文件信息Ranges ranges;//用于实现文件断点续传的请求文件区间 //判断请求报头中有没有某个字段bool has_header(const char *key) const;//获取请求报头中对应的字段值std::string get_header_value(const char *key, size_t id 0) const;//将key-val的字段值设定在http请求中void set_header(const char *key, const char *val);//判断对应的文件name是否存在主要判断MultipartFormData里面的name是否存在bool has_file(const char *key) const;//获取对应的文件信息MultipartFormData get_file_value(const char *key) const;};
}3.2 httplib响应
struct Response
{std::string version;//响应版本int status -1;//响应状态码std::string reason;Headers headers;//响应报头std::string body;//响应正文std::string location; // 重定向位置//设置正文内容正文类型void set_content(const std::string s,const std::string content_type);//设置头部字段,以key val方式void set_header(const std::string key,const std::string val);
};3.3 httplib服务端
class Server
{//Handler是对应请求资源路径的回调函数using Handler std::functionvoid(const Request , Response );//Handlers是一个映射表它映射的是请求资源路径和对应回调函数using Handlers std::vectorstd::pairstd::regex, Handler//对应方法设置对应请求路径和回调函数Server Get(const std::string pattern, Handler handler);Server Post(const std::string pattern, Handler handler);Server Put(const std::string pattern, Handler handler);Server Delete(const std::string pattern, Handler handler);//启动服务器bool listen(const std::string host, int port);
};Http请求对应每个请求方法都有自己的路由选择表。构建服务器的时候可以调用Server里面的Get(“/hello”,Hello)将请求方为GET请求资源/hello与函数Hello 注册 在Handlers表中。当http请求的请求方法是GET方法且请求资源是/hello,那么服务器则会调用Hello函数构建相对应的http响应。
3.4 httplib客户端
Get接口请求服务器对应请求路径的资源请求成功后返回一个result值这个值就是一个response类型信息通过返回值进行获得。
post接口是上传一个文件信息给服务器重载了两个函数一个是通过MultipartFormData类型进行组织好文件内容然后插入到MultipartFormDataItems数组中上传这种方式是可以在一个请求中上传多个文件信息另一个则是只针对一个文件信息上传。
class Client
{//构造一个客户端对象传入服务器Ip地址和端口explicit Client(const std::string host, int port);//向服务器发送GET请求Result Get(const std::string path);Result Get(const std::string path, const Headers headers);//向服务器发送Post请求//path是路径//body是正文//content_type是正文的类型Result Post(const std::string path, const std::string body,const std::string content_type);//以Post方法上传文件Result Post(const char *path, const MultipartFormDataItems items);Result Put(const std::string path, const std::string body,const std::string content_type);Result Delete(const std::string path, const std::string body,const std::string content_type);
};4. 使用
4.1 服务端
#includeiostream
#includecpp-httplib/httplib.hvoid Hi(const httplib::Request req,httplib::Response rsp)
{std::coutreq.methodstd::endl;std::coutreq.pathstd::endl;std::string res htmlbodyh1你好世界!/hi/body/html;rsp.set_content(res,text/html);}void File(const httplib::Request req,httplib::Response rsp)
{bool ret req.has_file(file);if(ret false){std::cout文件不存在std::endl;return;}auto file req.get_file_value(file);std::coutfile.namestd::endl;std::coutfile.filenamestd::endl;std::coutfile.contentstd::endl;std::coutfile.content_typestd::endl;
}int main()
{httplib::Server server;server.Get(/Hi,Hi);server.Post(/File,File);server.listen(0.0.0.0,8080);return 0;
}4.2 客户端
#includeiostream
#includecpp-httplib/httplib.hint main()
{httplib::Client client(127.0.0.1,8080);auto result1 client.Get(/Hi);if(result1 result1-status 200){std::coutresult1-bodystd::endl;}else{std::cerrNo content returnstd::endl;}httplib::MultipartFormData data;data.name file;data.filename upload;data.content upload content;data.content_type text/plain;httplib::MultipartFormDataItems items;items.push_back(data);auto result2 client.Post(/File,items);if(result2 result2-status 200){std::coutresult2-bodystd::endl;}else{std::cerrupload errorstd::endl;}return 0;
}all:server clientservre:server.ccg -o $ $^ -stdc17 -lpthreadclient:client.ccg -o $ $^ -stdc17 -lpthread