只想做个简单的 HTTP 服务,可那些经典的 C++ 库不是代码古老难用,就是编译麻烦复杂。能不能有一个现代化的 C++ 库,能实现简单的 HTTP 服务端和客户端的功能呢?Httplib,这个只需要一个头文件的库,值得你驻足一看。
HTTP库
简介
Cpp-Httplib,是 yhirose 在 Github 上开源的 C++11 的 HTTP/HTTPS 服务端和客户端库,仓库地址为
https://github.com/yhirose/cpp-httplib,目前版本为 0.7.0。Httplib 只有一个头文件,使用时直接引用即可;其使用简单,设计现代化,充分使用了回调的方式简化了代码,充分利用了 C++11 的功能降低了代码复杂度;功能丰富,支持 OpenSSL 和 Zlib,充分能够实现小型的 HTTP 服务端应用,和基础的客户端调用功能。
C++的HTTP库
安装
直接下载项目,使用头文件 httplib.h 即可:
git clone https://github.com/yhirose/cpp-httplib.git
注意由于
#include
#include
示例
Httplib 提供了HTTP的服务端功能。下面给出一个基本的服务器例子:
#include
int main(void)
{
using namespace httplib;
Server svr;
svr.Get("/hi", [](const Request& req, Response& res) {
res.set_content("Hello World!", "text/plain");
});
svr.Get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) {
auto numbers = req.matches[1];
res.set_content(numbers, "text/plain");
});
svr.Get("/body-header-param", [](const Request& req, Response& res) {
if (req.has_header("Content-Length")) {
auto val = req.get_header_value("Content-Length");
}
if (req.has_param("key")) {
auto val = req.get_param_value("key");
}
res.set_content(req.body, "text/plain");
});
svr.Get("/stop", [&](const Request& req, Response& res) {
svr.stop();
});
svr.listen("localhost", 1234);
}
可以看到,首先定义了 Server 实例,然后通过 Get 接口注册了路由和处理函数,路由以正则表达式表示,而处理函数则传入请求和响应。
在处理函数中,通过使用响应的 set_content 接口进行响应数据的传送;使用请求的matches接口获取路由中的参数;通过 get_header_value 和 get_param_value 等获取请求头和请求参数等。最后,使用listen来监听端口,实现了服务器的启动。
从这个简单的例子我们可以看到,htttplib 作为服务端,功能齐全,与其它现代化语言的轻量级服务端框架十分相似。
Httplib 还可以很方便地实现静态文件的服务:
auto ret = svr.set_mount_point("/", "./www");
ret = svr.set_mount_point("/public", "./www1");
ret = svr.set_mount_point("/public", "./www2");
另外,httplib 还提供了日志自定义、文件上传、超时时间配置、线程池配置等功能,可以很方便地进行适合自身需要的配置和优化。
// 自定义日志处理器
svr.set_logger([](const auto& req, const auto& res) {
your_logger(req, res);
});
同时,httplib 也提供了HTTP客户端的功能,同样十分方便强大。
#include
#include
int main(void)
{
httplib::Client cli("localhost", 1234);
auto res = cli.Get("/hi");
if (res && res->status == 200) {
std::cout << res->body << std::endl;
}
}
在本例中,对 Client 进行实例化得到一个客户端,并通过 Get 接口进行了请求,然后得到返回的响应。
Httplib 支持常用的HTTP请求方法、请求头的配置、multipart 表单数据、超时设置、下载进度回调、HTTP验证、HTTP代理、……,功能十分丰富。
// 下载进度回调
httplib::Client client(url, port);
// 显示:0 / 000 bytes => 50% complete
std::shared_ptr res =
cli.Get("/", [](uint64_t len, uint64_t total) {
printf("%lld / %lld bytes => %d%% complete\n",
len, total,
(int)(len*100/total));
return true;
}
);
HTTP(S)请求
总结
Httplib,作为一个 C++ 的 HTTP 库,其设计现代化,使用方便,代码简洁,上手速度快,开发效率高,十分值得在小规模项目中进行使用。
Httplib 项目目前仍处于活跃开发阶段,文档例子丰富,代码规范整洁,编码清晰严谨,对现代 C++ 特性应用娴熟,是一个值得研究学习的项目。