建筑网站源码,网站设计 电子购物网站设计,网络营销的特点有哪些,怎么依赖网站开发app#x1f4df;作者主页#xff1a;慢热的陕西人 #x1f334;专栏链接#xff1a;C云备份项目 #x1f4e3;欢迎各位大佬#x1f44d;点赞#x1f525;关注#x1f693;收藏#xff0c;#x1f349;留言 主要内容介绍了第三方库httplib的一些内容#xff0c;以及实现… 作者主页慢热的陕西人 专栏链接C云备份项目 欢迎各位大佬点赞关注收藏留言 主要内容介绍了第三方库httplib的一些内容以及实现了一个简单的CS例子 文章目录 云备份day031.httplib库2.httplib实现server和client2.1httplib实现server端2.2httplib实现client端 云备份day03
1.httplib库
httplib 库一个 C11 单文件头的跨平台 HTTP/HTTPS 库。安装起来非常容易。只需包含 httplib.h 在你的代码 中即可。 httplib 库实际上是用于搭建一个简单的 http 服务器或者客户端的库这种第三方网络库可以让我们免去搭建服 务器或客户端的时间把更多的精力投入到具体的业务处理中提高开发效率。
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; //urlHeaders headers; //头部字段std::string body; //正文-有效载荷// for serverstd::string version;//协议版本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;void set_header(const char *key, const char *val);bool has_file(const char *key) const;MultipartFormData get_file_value(const char *key) const;};struct Response {std::string version; //协议版本int status -1; //响应状态码std::string reason; //Headers headers; //头部字段std::string body; //响应给客户端的正文std::string location; // Redirect locationvoid set_header(const char *key, const char *val); //设置头部字段void set_content(const std::string s, const char *content_type); //设置正文};class Server{using Handler std::functionvoid(const Request , Response ); //函数指针类型using Handlers std::vectorstd::pairstd::regex, Handler; //请求与处理函数的映射表std::functionTaskQueue *(void) new_task_queue; //线程池---用于处理请求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 Patch(const std::string pattern, Handler handler);Server Delete(const std::string pattern, Handler handler);Server Options(const std::string pattern, Handler handler);bool listen(const char *host, int port, int socket_flags 0); //搭建并启动http服务器};//用于搭建http客户端class Client{Client(const std::string host, int port); //传入服务器的ip地址和端口Result Get(const char *path, const Headers headers); //向服务器发送get请求Result Post(const char *path, const char *body, size_t content_length,const char *content_type);Result Post(const char *path, const MultipartFormDataItems items); //post请求提交多区域数据常用于多文件上传}
}Request Request结构体的作用 1.客户端保存的所有http请求相关信息最终组织http请求发送给服务器 2.服务器收到http请求之后进行解析将解析的数据保存在 Request结构体内部待后续处理 Response Response结构体的作用 用户将响应数据放到结构体中httplib会将其中的数据按照http响应的格式组织成http响应 然后发送给客户端 Server: server类的功能用于搭建http的服务器 **1.hander 函数指针类型**定义了一个http请求处理回调函数的方式 函数指针类型:定义了一个http请求处理回调函数格式httplib搭建的服务器收到请求后进行解析得到一Reques结构体 其中包含了请求数据根据请求数据我们就可以处理这个请求了这个处理函数定义的格式就是Handler格式 void(const Request ,Response ) Request参数1保存请求数据让用户能够根据请求数据进行业务处理。 Response参数需要用户在业务处理中填充数据最终要响应给客户端 2.Handlers 是一个请求路由数组: 其中包含两个信息std::vectorstd::pairstd::regex,Handler regex:正则表达式-用于匹配http请求资源路径 Handler:请求处理函数指针可以理解Handlers是一张表映射了一个客户端请求的资源路径和一个处理函数(用户自己定义的函数) 当服务器收到请求解析得到Request就会根据资源路径以及请求方法到这张表中查看有没有对应的处理函数 如果有则调用这个函数进行请求处理无则响应404. **处理流程**线程池处理http请求 httplib收到一个新建链接则将新的客户端连接抛入到线程池中 线程池中线程的工作 ①接收请求解析请求得到Request结构体也就是请求的数据 ②在Handlers映射表中根据请求信息查找处理函数如果有则调用函数处理 void(const Request , Response ) ③当处理函数调用完毕根据函数返回的Response结构体中的数据组织http响应发送给客户端 2.httplib实现server和client
2.1httplib实现server端
#includehttplib.husing namespace std;
using namespace httplib;// 处理 /hi 路径的 GET 请求返回 hello_world!
void Hello(const Request req, Response rsp)
{rsp.set_content(hello_world!, text/plain);rsp.status 200;
}// 处理 /numbers/{num} 路径的 GET 请求返回匹配到的数字
void Numbers(const Request req, Response rsp)
{auto num req.matches[1]; // 0 保存的是整体的 path往后的下标中保存的是数据rsp.set_content(num, text/plain);rsp.status 200;
}// 处理 /multipart 路径的 POST 请求返回上传的文件名和内容
void Multipart(const Request req, Response rsp)
{auto ret req.has_file(file);if (ret false){cout not file upload endl;rsp.status 400;return;}const auto file req.get_file_value(file);rsp.body.clear();rsp.body file.filename; // 文件名称rsp.body \n;rsp.body file.content; // 文件内容rsp.set_header(Content-Type, text/plain);rsp.status 200;return;
}int main()
{Server server; // 实例化一个 server 对象用于搭建服务器server.Get(/hi, Hello); // 注册一个针对 /hi 的 GET 请求的处理函数映射关系server.Get(R(/numbers/(\d)), Numbers); server.Post(/multipart, Multipart);server.listen(0.0.0.0, 9090);return 0;
}
2.2httplib实现client端
#includehttplib.h // 引入 httplib 库的头文件using namespace std; // 使用标准命名空间#define SERVER_IP 117.72.37.100 // 定义服务器 IP 地址常量
#define SERVER_PORT 9090 // 定义服务器端口号常量int main()
{// 实例化一个 httplib 客户端对象并指定服务器的 IP 地址和端口号httplib::Client client(SERVER_IP, SERVER_PORT);// 创建一个多部分表单数据项httplib::MultipartFormData item;item.name file; // 表单项的名称item.filename hello.text; // 文件名item.content hello world; // 文件内容item.content_type text/plain; // 文件内容类型// 创建一个多部分表单数据项列表并将上面创建的表单项添加到列表中httplib::MultipartFormDataItems items;items.push_back(item);// 向服务器发送 POST 请求提交多部分表单数据auto res client.Post(/multipart, items);// 输出服务器响应的状态码和响应体cout res-status endl; // 打印响应状态码cout res-body endl; // 打印响应体内容return 0;
} 到这本篇博客的内容就到此结束了。 如果觉得本篇博客内容对你有所帮助的话可以点赞收藏顺便关注一下 如果文章内容有错误欢迎在评论区指正