Cpp-httplib 简介#
cpp-httplib 是一个 c++ 实现的单个头文件的 http 库,接触到这个库的缘由呐,是因为最近我们团队的 AI 项目需要将结果从端侧设备上传到后台,为了能更好的与端侧 AI 结合,所以想采用 c++ 完成这项工作。项目地址
集成 cpp-httplib#
方式一、通过 vcpkg 安装#
这个需要先安装 vcpkg,这里就不多做介绍了。
安装完 vcpkg 之后通过以下命令即可安装 cpp-httplib
vcpkg install cpp-httplib:arm64-linux
安装时将arm64-linux
替换为设备对应的平台架构即可。
方式二、直接集成头文件#
Recommend
直接下载 httplib.h 文件到本地,放到你需要的项目当中即可。
client 使用示例#
client 构造#
httplib::Client cli("localhost");
httplib::Client cli("localhost:8080");
httplib::Client cli("http://localhost");
httplib::Client cli("http://localhost:8080");
httplib::Client cli("https://localhost");
httplib::SSLClient cli("localhost");
无参 Get 请求#
#include "httplib.h"
#include <iostream>
int main(void)
{
httplib::Client cli("localhost", 1234);
if (auto res = cli.Get("/hi")) {
if (res->status == 200) {
std::cout << res->body << std::endl;
}
} else {
auto err = res.error();
std::cout << "HTTP error: " << httplib::to_string(err) << std::endl;
}
}
cpp-httplib 将响应体(res->body
)封装为 std::string
类型,如果想要更方便的操作其中的值,可以考虑使用 json 库对其解析。
带 header 的 Get 请求#
httplib::Headers headers = {
{ "Accept-Encoding", "gzip, deflate" }
};
auto res = cli.Get("/hi", headers);
or
cli.set_default_headers({
{ "X-Access-Token", token }
});
auto res = cli.Get("/getUserList");
带 params 的 Get 请求#
std::stringstream ss;
ss << GetMillitimestamp();
std::string tStr = ss.str();
std::string sign = calculateSignature(appKey, appSecret, tStr);
httplib::Result res = cli.Get("/getToken?appKey=" + appKey + "&sign=" + sign + "×tamp=" + tStr);
这是能满足我需求的最简单的编写方式,当然它还提供了很多可以携带 parameter 的 API。
inline Result Client::Get(const std::string &path, const Params ¶ms,
const Headers &headers, Progress progress) {
return cli_->Get(path, params, headers, progress);
}
inline Result Client::Get(const std::string &path, const Params ¶ms,
const Headers &headers,
ContentReceiver content_receiver, Progress progress) {
return cli_->Get(path, params, headers, content_receiver, progress);
}
inline Result Client::Get(const std::string &path, const Params ¶ms,
const Headers &headers,
ResponseHandler response_handler,
ContentReceiver content_receiver, Progress progress) {
return cli_->Get(path, params, headers, response_handler, content_receiver,
progress);
}
不知为何作者没有提供一个简单的携带 parameter 的 API,就像这样:
inline Result Client::Get(const std::string &path, const Params ¶ms) {
return cli_->Get(path, params);
}