C++ 跨平台轻量级服务器框架httplib
一.基础介绍
关于C++的httplib库,它是一个开源的、轻量级的HTTP客户端/服务器库,实用于Linux和Windows平台。以下是一些关键信息:
- 简介:
- cpp-httplib 是一个C++编写的开源HTTP库,它提供了简单易用的接口,使开发者能够轻松地构建基于HTTP协议的应用程序。
- 它是一个多线程“阻塞”HTTP库,使用起来非常方便,只需要包含头文件httplib.h即可。
- 特点:
- 轻量级:仅依赖于C++标准库,无需安装额外的依赖项。
- 简单易用的接口:提供了简单直观的接口,方便处理HTTP哀求和相应。
- 客户端功能:可以用作HTTP客户端,发送HTTP哀求并接收相应。
- SSL/TLS支持:支持通过SSL/TLS举行安全的HTTP通信。
- 静态文件服务器:提供了静态文件服务器的功能。
- 跨平台支持:可在多个平台上运行,包罗Windows、Linux和macOS等。
- 使用:
- 编译时需要链接pthread库,例如使用g++编译器:g++ -o server server.cpp -lpthread。
- 服务端和客户端示例代码可以在腾讯云开发者社区找到。
- 根本布局:
- Request类包含哀求方法、路径、查询字符串、头部和正文。
- Response类包含状态码、头部和正文。
- Server类包含处理差别HTTP方法的函数,如Get、Post、Put等。
- Client类包含创建客户端和发送哀求的方法,如Get、Post、Put等。
- SSL支持:
- 若要使用SSL支持,需要定义CPPHTTPLIB_OPENSSL_SUPPORT,并确保有libssl和libcrypto的支持。目前只有httplib 1.1.1版本支持SSL服务器。
- GitHub地点:
- 项目的GitHub地点为:https://github.com/yhirose/cpp-httplib。
也可以用我的gitee 国本地点下载快,https://gitee.com/TheSeaRefusesNoRiver/cpp-httplib.git
二.说明
1.为什么保举httplib呢?因为C++ 没有太多好用的轻量级的服务器框架。像mongoose,oryx等等用起来很繁琐。当然很少会有人使用c++ 服务器框架 ╮( ̄▽ ̄)╭是吧?言归正传,httplib一是好用,语法简单,写起来非常容易,只有一个头文件引入。不需要导入类似boost这样很复杂的三方库。二是跨平台,arm银河麒麟、linux的ubuntu、centos和window都可以,编译简单。三是性能好,很容易通过,jmeter,apipost等测试工具。三是它自身提供一部分服务器功能,不用自己写。好比说文件下载功能。不用额外打一个nginx服务器了。
三.写法示例
服务器
- #include <iostream>
- #include "httplib.h"
- using namespace httplib;
- int main() {
- Server svr;
- // 定义根路径的GET请求处理器
- svr.Get("/", [](const Request &req, Response &res) {
- res.set_content("Welcome to the server!", "text/plain");
- });
- // 定义/hello路径的GET请求处理器
- svr.Get("/hello", [](const Request &req, Response &res) {
- res.set_content("Hello, Client!", "text/plain");
- });
- // 定义/echo路径的POST请求处理器
- svr.Post("/echo", [](const Request &req, Response &res) {
- res.set_content(req.body, "text/plain");
- });
- // 启动服务器,监听端口8080
- svr.listen("localhost", 8080);
- std::cout << "Server started at http://localhost:8080" << std::endl;
- return 0;
- }
复制代码 这个写法比javaspringboot 还优雅,写法公式: url + lamda表达式
客户端
- #include <iostream>
- #include "httplib.h"
- using namespace httplib;
- int main() {
- Client cli("localhost", 8080);
- // 发送GET请求到服务器的根路径
- auto res_root = cli.Get("/");
- if (res_root && res_root->status == 200) {
- std::cout << "Root Response: " << res_root->body << std::endl;
- } else {
- std::cerr << "Error: Unable to connect to server." << std::endl;
- }
- // 发送GET请求到服务器的/hello路径
- auto res_hello = cli.Get("/hello");
- if (res_hello && res_hello->status == 200) {
- std::cout << "Hello Response: " << res_hello->body << std::endl;
- } else {
- std::cerr << "Error: Unable to connect to server." << std::endl;
- }
- // 发送POST请求到服务器的/echo路径
- auto res_echo = cli.Post("/echo", "This is a POST request.", "text/plain");
- if (res_echo && res_echo->status == 200) {
- std::cout << "Echo Response: " << res_echo->body << std::endl;
- } else {
- std::cerr << "Error: Unable to connect to server." << std::endl;
- }
- return 0;
- }
复制代码 四.使用问题
1.linux 平台编译需要链接 线程库g++ -o server server.cpp -lpthread
2.windows vistudio需要版本大于即是2015,同时注意该库与其他socket 库使用可能辩论,使用预编译宏WIN32_LEAN_AND_MEAN
(关于WIN32_LEAN_AND_MEAN宏定义的使用,以下是一些关键信息:
作用:WIN32_LEAN_AND_MEAN是一个预处理器宏定义,通常在Windows编程中使用,特殊是在包含Windows头文件(如windows.h)时。当在项目中定义了WIN32_LEAN_AND_MEAN宏,它告诉编译器仅包含Windows SDK中最常用的函数和数据类型,从而减小编译时间和天生的可实行文件大小
。
淘汰编译时间:通过清除不常用的API和数据布局,可以明显淘汰头文件的大小,进而淘汰编译时间
。
减小程序大小:链接到较少的Windows库函数可以减小最终可实行文件的大小
。
淘汰定名辩论:windows.h包含了大量的定义,偶然候可能会与项目中的其他头文件产生定名辩论。使用WIN32_LEAN_AND_MEAN可以降低这种风险)
3.答应跨域及options

- #include <httplib.h>
- int main() {
- using namespace httplib;
- Server svr;
- // 设置全局默认响应头
- svr.set_default_headers({
- {"Access-Control-Allow-Origin", "*"},
- {"Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"},
- {"Access-Control-Max-Age", "3600"},
- {"Access-Control-Allow-Headers", "*"},
- {"Content-Type", "application/json;charset=utf-8"}
- });
- // 处理OPTIONS请求,这里处理复杂的前端请求。也就是二次访问的情况
- svr.Options("/*", [](const Request&, Response& res) {
- res.status = 200;
- });
- // 其他路由处理
- svr.Get("/test", [](const Request& req, Response& res) {
- res.set_content(R"({"message":"Hello World!"})", "application/json");
- });
- // 启动服务器
- svr.listen("0.0.0.0", 8090);
- return 0;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |