龙空技术网

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

每日开源代码 1347

前言:

此时看官们对“c语言中lib”大体比较重视,看官们都需要了解一些“c语言中lib”的相关内容。那么小编也在网摘上搜集了一些对于“c语言中lib””的相关文章,希望姐妹们能喜欢,兄弟们一起来了解一下吧!

只想做个简单的 HTTP 服务,可那些经典的 C++ 库不是代码古老难用,就是编译麻烦复杂。能不能有一个现代化的 C++ 库,能实现简单的 HTTP 服务端和客户端的功能呢?Httplib,这个只需要一个头文件的库,值得你驻足一看。

HTTP库

简介

Cpp-Httplib,是 yhirose 在 Github 上开源的 C++11 的 HTTP/HTTPS 服务端和客户端库,仓库地址为 ,目前版本为 0.7.0。Httplib 只有一个头文件,使用时直接引用即可;其使用简单,设计现代化,充分使用了回调的方式简化了代码,充分利用了 C++11 的功能降低了代码复杂度;功能丰富,支持 OpenSSL 和 Zlib,充分能够实现小型的 HTTP 服务端应用,和基础的客户端调用功能。

C++的HTTP库

安装

直接下载项目,使用头文件 httplib.h 即可:

git clone 

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

#include <httplib.h>#include <Windows.h>
示例

Httplib 提供了HTTP的服务端功能。下面给出一个基本的服务器例子:

#include <httplib.h>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 <httplib.h>#include <iostream>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% completestd::shared_ptr<httplib::Response> 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++ 特性应用娴熟,是一个值得研究学习的项目。

标签: #c语言中lib