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;
}
评论前必须登录!
注册