文章目錄
- httplib介紹與安裝
- 使用案例
httplib介紹與安裝
C++ HTTP 庫(cpp-httplib)是一個輕量級的 C++ HTTP 客戶端/服務器庫,它提供了簡單的 API 來創建 HTTP 服務器和客戶端,支持同步和異步操作。以下是一些關于cpp-httplib 的主要特點:
1.輕量級:cpp-httplib 的設計目標是簡單和輕量,只有一個頭文件包含即可,不依賴于任何外部庫。
2.跨平臺:它支持多種操作系統,包括 Windows、Linux 和 macOS。
3.同步和異步操作:庫提供了同步和異步兩種操作方式,允許開發者根據需要選擇。
4.支持 HTTP/1.1:它實現了 HTTP/1.1 協議,包括持久連接和管道化。
5.Multipart form-data:支持發送和接收 multipart/form-data 類型的請求,這對于文件上傳非常有用。
6.SSL/TLS 支持:通過使用 OpenSSL 或 mbedTLS 庫,cpp-httplib 支持 HTTPS 和 WSS。
7.簡單易用:API 設計簡潔,易于學習和使用。
8.性能:盡管是輕量級庫,但性能表現良好,適合多種應用場景。
9.社區活躍:cpp-httplib 有一個活躍的社區,不斷有新的功能和改進被加入。
安裝
git clone https://github.com/yhirose/cpp-httplib.git
接口介紹
請求中包含請求方法,請求的資源路徑,請求頭部,請求正文和查詢字符串。
struct Request
{std::string method;std::string path;Headers headers;std::string body;Params params;
};
響應中包含HTTP協議版本,響應狀態碼,響應狀態碼描述,響應頭部,響應正文。
struct Response
{std::string version;int status = -1;std::string reason;Headers headers;std::string body;void set_content(const std::string &s,const std::string &content_type);void set_header(const std::string &key,const std::string &val);
};
服務器句柄,通過GET/POST/PUT/DELETE函數處理對應的HTTP請求,設置請求路徑和對應的回調函數即可,通過listen函數進行對應端口的監聽。
class Server
{using Handler = std::function<void(const Request&, Response&)>;Server &Get(const std::string &pattern, Handler handler);Server &Post(const std::string &pattern, Handler handler);Server &Put(const std::string &pattern, Handler handler);Server &Delete(const std::string &pattern, Handler handler);bool listen(const std::string &host, int port);
};
客戶端句柄同樣也是GET/POST/PUT/DELETE發起對應的請求,參數為請求路徑,請求正文和請求的類型。
class Client
{explicit Client(const std::string &host, int port);Result Get(const std::string &path, const Headers &headers);Result Post(const std::string &path, const std::string &body,const std::string &content_type);Result Put(const std::string &path, const std::string &body,const std::string &content_type);Result Delete(const std::string &path, const std::string &body,const std::string &content_type);
};
使用案例
main.cc
#include "../common/httplib.h"
#include <iostream>int main()
{httplib::Server server;// using Handler = std::function<void(const Request &, Response &)>;server.Get("/hello",[](const httplib::Request & req, httplib::Response & resp){std::cout << "method: " << req.method << std::endl;std::cout << "path: " << req.path << std::endl;std::string body = "<html><body><h1>Hello World</h1></body></html>";resp.set_content(body,"text/html");resp.status = 200;});server.listen("0.0.0.0",8080);return 0;
}
makefile
main:main.ccg++ -o $@ $^ -std=c++17 -lpthread.PHONY:clean
clean:rm -rf main
makefile```makefile
main:main.ccg++ -o $@ $^ -std=c++17 -lpthread.PHONY:clean
clean:rm -rf main