Cpp-httplib の概要#
cpp-httplib は、C++ で実装された単一のヘッダーファイルの HTTP ライブラリです。このライブラリに触れたきっかけは、最近私たちのチームの AI プロジェクトで、結果をエンドデバイスからバックエンドにアップロードする必要があったためです。エンドデバイスの AI との統合をより良くするために、この作業を C++ で行うことにしました。プロジェクトのリンク
cpp-httplib の統合方法#
方法 1: vcpkg を使用してインストールする#
まず、vcpkg をインストールする必要がありますが、ここでは詳細な説明は省略します。
vcpkg をインストールした後、以下のコマンドを使用して cpp-httplib をインストールできます。
vcpkg install cpp-httplib:arm64-linux
インストールする際にarm64-linux
をデバイスの対応するプラットフォームアーキテクチャに置き換えてください。
方法 2: ヘッダーファイルを直接統合する#
推奨
httplib.h ファイルを直接ダウンロードし、必要なプロジェクトに配置してください。
クライアントの使用例#
クライアントの作成#
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 ライブラリを使用することを検討してください。
ヘッダー付きの GET リクエスト#
httplib::Headers headers = {
{ "Accept-Encoding", "gzip, deflate" }
};
auto res = cli.Get("/hi", headers);
または
cli.set_default_headers({
{ "X-Access-Token", token }
});
auto res = cli.Get("/getUserList");
パラメータ付きの 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);
これは私の要件を満たすための最もシンプルな書き方ですが、他にもパラメータを持つ 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);
}
なぜ作者が単純なパラメータを持つ API を提供していないのかはわかりませんが、次のように提供しているべきです:
inline Result Client::Get(const std::string &path, const Params ¶ms) {
return cli_->Get(path, params);
}