云计算百科
云计算领域专业知识百科平台

cpp-httplib 快速入门:从单头文件到你的第一个 HTTP 服务器

  • 后端
  • 网络

【免费下载链接】cpp-httplib

A C++ header-only HTTP/HTTPS server and client library

项目地址:
https://gitcode.com/GitHub_Trending/cp/cpp-httplib

点击查看 免费下载

本篇技术指南以 cpp-httplib 官方 Tour 教程第一章(docs-src/pages/ja/tour/01-getting-started.md)为骨架,完整讲解从获取 httplib.h、准备编译器,到编写、编译、运行第一个 Hello World HTTP 服务器的全过程。读完本文,你将掌握 cpp-httplib 的最小可用链路,并理解 listen() 背后 Server 的底层工作方式,为后续深入客户端与服务器功能打下基础。

开始之前:为什么只有一个头文件

cpp-httplib 是一个 header-only(纯头文件)的 C++ HTTP/HTTPS 服务器与客户端库,整个库就是一个文件。在本仓库根目录下存放着 httplib.h,文件头部注明了当前版本信息(CPPHTTPLIB_VERSION 为 0.58.0,见 httplib.h 头部注释),并以 MIT 协议发布。

正因为"一个文件即一个库",接入项目只需要两步:

  • 获取 httplib.h;
  • 把它放进项目的 include 路径(或直接与源码放在同一目录)。
  • 仓库中还提供了 test/include_httplib.cc,其唯一作用就是在独立的编译单元中单独 #include <httplib.h>,以验证该头文件可以脱离任何其他源文件独立编译链接——这从侧面印证了"单一头文件即可用"的设计。

    提示:官方教程建议始终使用最新版本。若你的项目不在本仓库内,可以直接复制本仓库根目录下的 httplib.h 到你的项目目录;若要自行获取最新版,也可参考仓库的 release 流程(见 scripts/release.sh)。

    编译器与开发环境准备

    cpp-httplib 只依赖 C++ 标准库,不需要第三方链接库。教程给出了三大主流平台的推荐开发环境:

    | 操作系统 | 开发环境 | 安装方式 | | — | ——– | ———— | | macOS | Apple Clang | Xcode Command Line Tools(xcode-select –install) | | Ubuntu | clang++ 或 g++ | apt install clang 或 apt install g++ | | Windows | MSVC | Visual Studio 2022 或更高版本(安装时勾选 C++ 组件) |

    需要注意两点:

    • 教程中的示例代码使用 C++17 编写,以求简洁;但 cpp-httplib 库本身在 C++11 下即可编译,低版本编译器同样可以接入。
    • 在 Linux/macOS 上编译链接时通常需要加 -pthread,因为服务器内部会创建线程来处理并发请求。

    Hello World 服务器:最小可运行代码

    将下面的代码保存为 server.cpp:

    #include "httplib.h"

    int main() {
    httplib::Server svr;

    svr.Get("/", [](const httplib::Request&, httplib::Response& res) {
    res.set_content("Hello, World!", "text/plain");
    });

    svr.listen("0.0.0.0", 8080);
    }

    这段代码的语义非常直白:

    • httplib::Server svr; 创建服务器实例(Server 类定义于 httplib.h#L2178);
    • svr.Get("/", …) 为 GET / 路径注册处理函数,当请求命中时,回调通过 res.set_content("Hello, World!", "text/plain") 写入响应体,并声明其 Content-Type 为 text/plain(set_content 的声明见 httplib.h#L1853);
    • svr.listen("0.0.0.0", 8080) 让服务器监听 0.0.0.0 的 8080 端口,开始接受请求。

    仅这几行代码,一个能够响应 HTTP 请求的服务器就写完了。仓库中的 example/hello.cc 与上述示例几乎同构:它注册了 GET /hi 并返回 "Hello World!",随后 listen("0.0.0.0", 8080),可作为对照参考。

    编译与运行

    教程给出了三个平台的编译命令:

    # macOS
    clang++ -std=c++17 -o server server.cpp

    # Linux
    # `-pthread`: cpp-httplib 内部使用线程
    clang++ -std=c++17 -pthread -o server server.cpp

    # Windows(Developer Command Prompt 中)
    # `/EHsc`: 启用 C++ 异常处理
    cl /EHsc /std:c++17 server.cpp

    参数说明:

    • -std=c++17:示例代码按 C++17 标准编译;
    • -pthread:链接 POSIX 线程库。因为 Server::listen() 会启动多线程处理请求(详见下文"底层机制"),不加该选项在 Linux/macOS 上通常会出现链接错误;
    • /EHsc:MSVC 下启用 C++ 异常处理;
    • 如果想让库在 C++11 下编译,把 -std=c++17 换成 -std=c++11 即可(示例代码本身需要 C++17 特性,如结构化绑定等)。

    编译成功后运行:

    # macOS / Linux
    ./server

    # Windows
    server.exe

    验证:浏览器与 curl

    服务器运行后,打开浏览器访问 http://localhost:8080,页面显示 "Hello, World!" 即代表成功。

    也可以使用 curl 从命令行验证:

    curl http://localhost:8080/
    # Hello, World!

    要停止服务器,在终端中按 Ctrl+C 即可。

    深入一层:listen() 的底层机制

    从源码结构看,Server::listen() 并不是一个简单的阻塞循环,而是两个步骤的组合,见 httplib.h#L13245-L13248:

    inline bool Server::listen(const std::string &host, int port,
    int socket_flags) {
    return bind_to_port(host, port, socket_flags) && listen_internal();
    }

    • bind_to_port():将 socket 绑定到指定主机与端口;
    • listen_internal():真正进入 accept 循环。

    listen_internal() 的实现(见 httplib.h#L13889-L13919)可以推断出以下关键行为:

    • 进入循环前会调用可选的 start_handler_ 启动回调,并把 is_running_ 置为 true,配套的 wait_until_ready()(httplib.h#L13252-L13256)可让调用方等待服务器真正就绪;
    • 循环体内通过 new_task_queue()(httplib.h#L13906)创建任务队列,接受的连接会被分发到线程池处理——这正是 Linux 编译需要 -pthread 的根源,也是为什么多个客户端可以同时访问而互不阻塞;
    • 循环以 svr_sock_ != INVALID_SOCKET 为继续条件,配合 stop()(httplib.h#L13258-L13268)关闭监听 socket,实现安全停机。

    换句话说,listen() 一行调用背后是一个"绑定 → 监听 → 线程池分发 → 并发处理"的完整服务框架,而这些细节对使用者完全透明。

    进阶示例与下一步

    入门之后,可以查看仓库中的两个示例文件加深理解:

    • example/hello.cc:最简服务器,与本文示例互为对照;
    • example/simplesvr.cc:功能更完整的服务器,展示了 set_error_handler() 自定义错误页、set_logger() 记录请求日志、set_mount_point() 挂载静态文件目录、Post() 处理 multipart 上传等进阶用法,还演示了 CPPHTTPLIB_OPENSSL_SUPPORT 宏下切换为 SSLServer 的方式。

    服务器的基本用法已经掌握,下一步自然是客户端:cpp-httplib 同时内置了完整的 HTTP 客户端能力(httplib::Client),支持 GET/POST、路径参数、查询参数、自定义请求头、表单与文件上传以及错误处理。请继续阅读 Tour 教程的第二章 Basic Client,也可以先浏览教程总览 docs-src/pages/ja/tour/index.md 了解后续章节安排(Basic Server、静态文件服务器、TLS 与 HTTPS、WebSocket 等)。

    赞

    分享

    • 后端
    • 网络

    【免费下载链接】cpp-httplib

    A C++ header-only HTTP/HTTPS server and client library

    项目地址:
    https://gitcode.com/GitHub_Trending/cp/cpp-httplib

    点击查看 免费下载

    上一篇:
    Selenium Manager(Rust)开发指南:为 AI Agent 编写的代码位置、构建、测试与代码约定

    下一篇:
    diff2html完整指南:5大核心功能详解与高效应用方法

    创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » cpp-httplib 快速入门:从单头文件到你的第一个 HTTP 服务器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!