與客戶端)
cpp-httplib一個頭文件頂一套 HTTP/HTTPS 服務(wù)與客戶端【免費下載鏈接】cpp-httplibA C header-only HTTP/HTTPS server and client library項目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplibcpp-httplib 是一個 C11 單文件、header-only 的庫同時覆蓋 HTTP/HTTPS 服務(wù)端與客戶端適合想在 C 項目里快速加網(wǎng)絡(luò)接口的你。把唯一的httplib.h拷進工程、#include一行就能寫代碼沒有構(gòu)建系統(tǒng)沒有鏈接步驟。給 C 項目加 HTTP 接口為什么總要挑一堆依賴Python、Go 的世界里HTTP 基本是標準庫自帶的。C 不是想給設(shè)備加個管理頁、給內(nèi)部服務(wù)加個小客戶端常規(guī)路線是先選一個框架再配構(gòu)建系統(tǒng)然后還得花點時間學(xué)它的路由模型才寫得出一條路由。越搭越重是這類需求最常見的體感。cpp-httplib 走的是反面路線全部邏輯裝在一個頭文件里HTTP 層面零第三方依賴要 HTTPS 才需要引入一個 TLS 庫。代價是它的并發(fā)模型偏樸素——線程池處理請求定位不是網(wǎng)關(guān)級產(chǎn)品這一點后文邊界部分會講清楚。寫一個 .cppg 編譯一次就能跑起來驗證最快的方式是把倉庫拉下來取出頭文件寫最短的服務(wù)端#include httplib.h int main() { httplib::Server svr; svr.Get(/, [](const httplib::Request , httplib::Response res) { res.set_content(hello from cpp-httplib, text/plain); }); svr.listen(0.0.0.0, 8080); }git clone https://gitcode.com/GitHub_Trending/cp/cpp-httplib g -stdc11 -pthread -I cpp-httplib -o server server.cpp./server啟動后瀏覽器打開http://localhost:8080即可訪問。沒有 CMake沒有包管理器??蛻舳艘粋?cè)是對稱的httplib::Client cli(http://host)之后直接調(diào)Get、Post收發(fā)兩個角色由同一個頭文件承擔。更完整的用法可以翻 示例目錄 和 README路由、鑒權(quán)、上傳都有可運行的參考。三個值得看懂的設(shè)計選擇為什么敢只用一個頭文件不是單純文件少。服務(wù)端、客戶端都寫在同一個.h里功能差異用預(yù)處理宏控制默認只編譯核心 HTTPHTTPS、WebSocket、SSE、gzip/brotli/zstd 壓縮分別由對應(yīng)宏開啟。這帶來兩個實際好處功能清單在文件頭部一目了然沒定義的宏不會進你的二進制嵌入現(xiàn)有工程只需要一行#include。代價同樣直接header-only 意味著大工程的每個編譯單元都要重編這個文件編譯時間會攤到全工程。這是所有 header-only 庫共有的取舍選型前先知道它。線程池默認值怎么給怎么換服務(wù)端用線程池消化請求默認值按機器規(guī)格推導(dǎo)初始線程數(shù)取max(8, CPU 核數(shù) - 1)池上限是初始值的 4 倍空閑線程 3 秒后回收并發(fā)上來時現(xiàn)開新線程。這個模型覆蓋中小并發(fā)的多數(shù)業(yè)務(wù)場景已經(jīng)足夠想換成定長池或調(diào)參數(shù)給svr.new_task_queue賦一個自己的任務(wù)隊列工廠即可不用改庫。HTTPS 不必綁定 OpenSSL#define CPPHTTPLIB_OPENSSL_SUPPORT #include httplib.h httplib::SSLServer svr(server.pem, server.key); svr.listen(0.0.0.0, 443);后端可選 OpenSSL、BoringSSL、mbedTLS、wolfSSL 四種定義對應(yīng)宏切換Linux 下編譯時補-lssl -lcrypto。這對發(fā)行版與嵌入式環(huán)境很關(guān)鍵部分最小系統(tǒng)沒有 OpenSSL 但有 mbedTLScpp-httplib 不把路堵死在一家的 TLS 實現(xiàn)上。 完整案例走查從 REST API 到翻譯 Web 頁倉庫文檔里的 llm-app 章節(jié) 給了一條完整路線做一個翻譯應(yīng)用先起 REST 接口再做流式輸出然后接 Web 頁面最后套上桌面殼。組合方式正是本地工具 網(wǎng)頁這類常見需求的骨架。先注冊/api/models、/api/translate這類路由svr.Post(/api/translate, handler)讀請求體、回 JSON再用 SSE 把翻譯結(jié)果逐段推給前端避免整段生成完才返回的等待最后用set_mount_point掛上前端靜態(tài)目錄瀏覽器直接訪問。同一套服務(wù)還能包成本地桌面窗口界面渲染和翻譯調(diào)用走的是同一組 HTTP 接口這個例子沒有魔法路由、流式、靜態(tài)文件三件套的標準組合。任何給現(xiàn)有程序加個網(wǎng)頁的需求基本都能從這幾塊積木里拼出來。邊界與避坑哪些場景先放棄官方 README 對限制講得很直白這里直接列出來WebSocket 每個連接占一個線程心跳 ping 還會再占一個。README 明確說該模型面向中小規(guī)模如果你預(yù)期海量 WS 并發(fā)連接這個庫不是為你設(shè)計的。阻塞 I/O 每請求一線程多數(shù)業(yè)務(wù)場景夠用但單機十萬連接、超高 QPS 的訴求去看非阻塞框架。WebSocket 擴展permessage-deflate 等未實現(xiàn)服務(wù)器會在握手時直接拒絕協(xié)商連接本身仍可用。靜態(tài)文件服務(wù)與 WebSocket 升級只接受 GET/HEAD掛在其他方法上不會生效。MSVC 只官方支持最新版 Visual Studio老版本行為不保證。還有一個容易踩的點查詢參數(shù)req.has_param、路徑參數(shù)req.path_params、multipart 文件req.has_file是三套獨立 API取錯地方就是空值。前端反饋參數(shù)丟了時先查它到底在哪個袋子里。選型對照適合什么不適合什么維度適合不適合規(guī)模單機內(nèi)部服務(wù)、設(shè)備管理頁、中小并發(fā)十萬連接、網(wǎng)關(guān)級超高 QPS功能HTTP/HTTPS 服務(wù)端客戶端、WebSocket、SSE、壓縮、靜態(tài)文件復(fù)雜服務(wù)網(wǎng)格、WebSocket 擴展協(xié)商集成header-only 直接嵌入Windows/Linux/macOSGCC/Clang/MSVC編譯時間預(yù)算極緊的大型工程TLSOpenSSL / BoringSSL / mbedTLS / wolfSSL 任選上述 TLS 庫一個都沒有的環(huán)境收尾如果你的需求是盡快給 C 程序掛上接口又不想多管一份依賴cpp-httplib 是可以當天動手試的那個??寺}庫順著 快速入門 讀一遍今天就能寫下第一條路由。【免費下載鏈接】cpp-httplibA C header-only HTTP/HTTPS server and client library項目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考