Linux下cpp-httplib库的使用
·
一、cpp-httplib库简介
cpp-httplib是一个C++11的单头文件的跨平台HTTP/HTTPS库。其配置极其简单,只需在代码中包含httplib.h文件即可。其github地址为:https://github.com/yhirose/cpp-httplib
二、下载编译cpp-httplib源码
从 https://github.com/yhirose/cpp-httplib/releases 下载cpp-httplib源码:

解压缩,进入源码目录,可以看到其目录结构如下:

编译:
cmake . -DCMAKE_INSTALL_PREFIX=$(pwd)/install
make
make install
可以看到cpp-httplib源码目录的install目录下生成了它的头文件:

三、cpp-httplib的使用例子
编写http服务器simplesvr.cc:
#include <cstdio>
#include <httplib.h>
#include <iostream>
#define SERVER_CERT_FILE "./cert.pem"
#define SERVER_PRIVATE_KEY_FILE "./key.pem"
using namespace httplib;
using namespace std;
string dump_headers(const Headers &headers) {
string s;
char buf[BUFSIZ];
for (const auto &x : headers) {
snprintf(buf, sizeof(buf), "%s: %s\n", x.first.c_str(), x.second.c_str());
s += buf;
}
return s;
}
string dump_multipart_formdata(const MultipartFormData &form) {
string s;
char buf[BUFSIZ];
s += "--------------------------------\n";
for (const auto &x : form.fields) {
const auto &name = x.first;
const auto &field = x.second;
snprintf(buf, sizeof(buf), "name: %s\n", name.c_str());
s += buf;
snprintf(buf, sizeof(buf), "text length: %zu\n", field.content.size());
s += buf;
s += "----------------\n";
}
for (const auto &x : form.files) {
const auto &name = x.first;
const auto &file = x.second;
snprintf(buf, sizeof(buf), "name: %s\n", name.c_str());
s += buf;
snprintf(buf, sizeof(buf), "filename: %s\n", file.filename.c_str());
s += buf;
snprintf(buf, sizeof(buf), "content type: %s\n", file.content_type.c_str());
s += buf;
snprintf(buf, sizeof(buf), "text length: %zu\n", file.content.size());
s += buf;
s += "----------------\n";
}
return s;
}
string log(const Request &req, const Response &res) {
string s;
char buf[BUFSIZ];
s += "================================\n";
snprintf(buf, sizeof(buf), "%s %s %s", req.method.c_str(),
req.version.c_str(), req.path.c_str());
s += buf;
string query;
for (auto it = req.params.begin(); it != req.params.end(); ++it) {
const auto &x = *it;
snprintf(buf, sizeof(buf), "%c%s=%s",
(it == req.params.begin()) ? '?' : '&', x.first.c_str(),
x.second.c_str());
query += buf;
}
snprintf(buf, sizeof(buf), "%s\n", query.c_str());
s += buf;
s += dump_headers(req.headers);
s += dump_multipart_formdata(req.form);
s += "--------------------------------\n";
snprintf(buf, sizeof(buf), "%d\n", res.status);
s += buf;
s += dump_headers(res.headers);
return s;
}
int main(int argc, const char **argv) {
if (argc > 1 && string("--help") == argv[1]) {
cout << "usage: simplesvr [PORT] [DIR]" << endl;
return 1;
}
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
SSLServer svr(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE);
#else
Server svr;
#endif
svr.Post("/message/receipt", [](const Request &req, Response &res) {
auto body = dump_headers(req.headers) + dump_multipart_formdata(req.form);
res.set_content(body, "text/plain");
});
svr.set_error_handler([](const Request & /*req*/, Response &res) {
const char *fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>";
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), fmt, res.status);
res.set_content(buf, "text/html");
});
svr.set_logger(
[](const Request &req, const Response &res) { cout << log(req, res); });
auto port = 8050;
if (argc > 1) { port = atoi(argv[1]); }
auto base_dir = "./";
if (argc > 2) { base_dir = argv[2]; }
if (!svr.set_mount_point("/", base_dir)) {
cout << "The specified base directory doesn't exist...";
return 1;
}
cout << "The server started at port " << port << "..." << endl;
//svr.listen("localhost", port);
svr.listen("192.168.31.130", port);
return 0;
}
编译:
g++ simplesvr.cc -o simplesvr -g -IXXX/cpp-httplib-0.28.0/install/include
运行:

编写http客户端simplecli.cc:
#include <httplib.h>
#include <iostream>
using namespace std;
int main(void) {
//httplib::Client cli("http://192.168.31.80:8081");
httplib::Client cli("http://192.168.31.130:8050");
if(auto res = cli.Post("/message/receipt", "\"datetime\":\"2025-12-09 13:51:36\"", "application/json")){
//if(auto res = cli.Post("/message/receipt", "datetime", "application/json")){
cout << res->status << endl;
//cout << res->get_header_value("Content-Type") << endl;
cout << res->body << endl;
}
else{
cout << res.error() << endl;
}
return 0;
}
编译:
g++ simplecli.cc -o simplecli -g -IXXX/cpp-httplib-0.28.0/install/include
运行客户端simplecli:

可以看到服务器收到了客户端的信息:

更多推荐



所有评论(0)