Cpp-Httplib - 只有一个C++头文件的跨平台HTTP库

Cpp-Httplib - 只有一个C++头文件的跨平台HTTP库

编码文章call10242025-03-11 12:43:3649A+A-

只想做个简单的 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

注意由于 库的原因,编译需要 g++ 版本大于 4.8。而在 Windows 上使用时,需要在 Windows.h 前引用:

#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++ 特性应用娴熟,是一个值得研究学习的项目。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4