Cpp-httplib 簡介#
cpp-httplib 是一個 c++ 實現的單個頭文件的 http 庫,接觸到這個庫的緣由呐,是因為最近我們團隊的 AI 項目需要將結果從端側設備上傳到後臺,為了能更好的與端側 AI 結合,所以想採用 c++ 完成這項工作。項目地址
集成 cpp-httplib#
方式一、通過 vcpkg 安裝#
這個需要先安裝 vcpkg,這裡就不多做介紹了。
安裝完 vcpkg 之後通過以下命令即可安裝 cpp-httplib
vcpkg install cpp-httplib:arm64-linux
安裝時將arm64-linux
替換為設備對應的平台架構即可。
方式二、直接集成頭文件#
推薦
直接下載 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);
}