当前位置: 首页 > article >正文

【C++】httplib:轻量级的 HTTP 服务器和客户端

本教程采用渐进式讲解方式,适用于 MinGW 环境。我们将从 httplib 的基本概念入手,通过一个小型 Demo 展示其核心用法,最后深入探讨高级功能与实际应用场景。


1. 简介

1.1 httplib 基本概念

httplib 是一个轻量级的 C++ HTTP 库,设计初衷是为嵌入式系统和资源受限环境提供简洁高效的 HTTP 支持。它是一个单头文件库(httplib.h),无需外部依赖,支持创建 HTTP 服务器和客户端,并兼容 HTTP/1.1 协议。httplib 的主要特点包括:

  • 无外部依赖:只需包含头文件即可使用,无需额外的库文件。
  • 跨平台:支持 Windows、Linux 和 macOS 等操作系统。
  • 简单易用:提供直观的 API,开发者可以快速实现 HTTP 请求和响应的处理。
  • 支持 SSL/TLS:通过集成 OpenSSL,可以启用 HTTPS 功能。

在 MinGW 环境下,编译时可能需要链接 ws2_32 库(视具体实现而定),方法是在编译命令中添加 -lws2_32 参数。也可以通过静态链接 MinGW 库来避免运行时依赖动态库。具体的编译命令如下:

g++ -o main.exe main.cpp -lws2_32 -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread
  • static-libgcc:静态链接 GCC 运行时库。
  • static-libstdc++:静态链接 C++ 标准库。
  • Wl,-Bstatic -lstdc++ -lpthread:确保标准库和线程库也以静态方式链接。

1.2 获取 httplib

由于 httplib 是头文件库,安装非常简单。你可以从其官方 GitHub 仓库(https://github.com/yhirose/cpp-httplib)下载最新版本的 httplib.h,然后将其放入项目目录,并在代码中通过以下方式包含:

#include "httplib.h"

接下来,我们将通过一个简单的 Demo 展示 httplib 的核心用法。


2. 快速入门:一个小型 Demo

为了让你快速上手,我们将编写一个 HTTP 服务器和客户端的示例。服务器监听本地 8080 端口并返回简单消息,客户端则向服务器发送请求并打印响应。

2.1 HTTP 服务器 Demo

以下是一个简单的 HTTP 服务器实现:

#include "httplib.h"
#include <iostream>

int main() {
    // 创建 HTTP 服务器
    httplib::Server svr;

    // 定义根路径的 GET 请求处理
    svr.Get("/", [](const httplib::Request& req, httplib::Response& res) {
        res.set_content("Hello, World!", "text/plain");
    });

    // 启动服务器,监听 localhost:8080
    std::cout << "Server started at http://localhost:8080" << std::endl;
    svr.listen("localhost", 8080);

    return 0;
}

编译命令

g++ -o server server.cpp -lws2_32

代码说明

  1. httplib::Server 创建服务器实例。
  2. svr.Get 定义了对 / 路径的 GET 请求处理,返回纯文本 “Hello, World!”。
  3. svr.listen 启动服务器,监听指定地址和端口。

2.2 HTTP 客户端 Demo

以下是对应的客户端代码:

#include "httplib.h"
#include <iostream>

int main() {
    // 创建 HTTP 客户端,连接 localhost:8080
    httplib::Client cli("localhost", 8080);

    // 发送 GET 请求
    auto res = cli.Get("/");

    // 检查并输出响应
    if (res && res->status == 200) {
        std::cout << "Response: " << res->body << std::endl;
    } else {
        std::cout << "Request failed" << std::endl;
    }

    return 0;
}

编译命令

g++ -o client client.cpp -lws2_32

代码说明

  1. httplib::Client 创建客户端实例,指定服务器地址和端口。
  2. cli.Get 发送 GET 请求到 / 路径。
  3. 检查响应对象 res,确保请求成功(状态码 200),并输出响应正文。

2.3 运行 Demo

  1. 打开一个终端,运行服务器:

    ./server
    

    你将看到提示 “Server started at http://localhost:8080”。

  2. 打开另一个终端,运行客户端:

    ./client
    

    客户端将输出 “Response: Hello, World!”。

通过这个 Demo,你已经掌握了 httplib 创建服务器和客户端的基本流程。接下来,我们将深入探讨其高级功能。


3. 深入探讨:高级功能与实际应用

在快速入门中,我们了解了 httplib 的基础用法。现在,我们将探索其高级功能,并展示如何在实际项目中应用这些特性。

3.1 HTTP 服务器高级功能

3.1.1 路由和参数化路径

httplib 支持多种 HTTP 方法(GET、POST、PUT、DELETE 等),并允许为不同路径设置处理函数。以下是一个示例,展示如何处理参数化路径和 POST 请求:

svr.Get("/user/:id", [](const httplib::Request& req, httplib::Response& res) {
    auto id = req.path_params.at("id"); // 获取路径参数
    res.set_content("User ID: " + id, "text/plain");
});

svr.Post("/submit", [](const httplib::Request& req, httplib::Response& res) {
    auto data = req.body; // 获取 POST 数据
    res.set_content("Received: " + data, "text/plain");
});

访问 /user/123 将返回 “User ID: 123”。

3.1.2 静态文件服务

httplib 可以将本地目录映射为静态文件服务。例如:

svr.set_mount_point("/", "./www");

假设 ./www 目录下有 index.html,访问 http://localhost:8080/index.html 将返回该文件内容。

3.1.3 SSL/TLS 支持

要启用 HTTPS,需要使用 httplib::SSLServer 并提供证书和私钥:

httplib::SSLServer svr("cert.pem", "key.pem");
svr.Get("/", [](const httplib::Request& req, httplib::Response& res) {
    res.set_content("Hello, HTTPS!", "text/plain");
});
svr.listen("localhost", 443);

注意:编译时需链接 OpenSSL 库(-lssl -lcrypto),并确保 MinGW 环境支持 OpenSSL。

3.2 HTTP 客户端高级功能

3.2.1 发送多种请求

客户端支持 GET、POST、PUT、DELETE 等请求。例如:

// POST 请求
auto res = cli.Post("/submit", "data", "text/plain");

// PUT 请求
auto res = cli.Put("/update", "new data", "text/plain");

// DELETE 请求
auto res = cli.Delete("/delete");
3.2.2 设置请求头

可以通过 httplib::Headers 设置自定义请求头:

httplib::Headers headers = {{"Authorization", "Bearer token"}};
auto res = cli.Get("/", headers);
3.2.3 HTTPS 支持

客户端支持 HTTPS 请求:

httplib::SSLClient cli("localhost", 443);
auto res = cli.Get("/");

同样需要 OpenSSL 支持。

3.3 实际应用场景

3.3.1 RESTful API 服务器

httplib 非常适合构建 RESTful API。例如:

svr.Get("/api/users", [](const httplib::Request& req, httplib::Response& res) {
    res.set_content("[{\"id\":1,\"name\":\"Alice\"}]", "application/json");
});

svr.Post("/api/users", [](const httplib::Request& req, httplib::Response& res) {
    res.set_content("User created", "text/plain");
});
3.3.2 微服务通信

在微服务架构中,httplib 可用于服务间通信:

// 服务 A(客户端)
httplib::Client cli("service-b", 8080);
auto res = cli.Get("/data");

// 服务 B(服务器)
svr.Get("/data", [](const httplib::Request& req, httplib::Response& res) {
    res.set_content("Data from Service B", "text/plain");
});

4. 总结

通过本教程,你已经全面了解了 C++ httplib 的功能。从基础概念到快速入门 Demo,再到高级功能和实际应用,httplib 展示了其轻量、灵活和强大的特性。在 MinGW 环境下使用时,建议链接 ws2_32 库以确保兼容性(视具体需求而定)。希望这篇教程能帮助你在项目中高效使用 httplib!


以上是修改后的完整教程,去掉了 Winsock 相关内容。如果你还有其他需求或测试中发现新的调整点,请随时告诉我!


http://www.kler.cn/a/612189.html

相关文章:

  • vue 双向绑定的原理是什么
  • Linux Namespace(网络命名空间)系列三 --- 使用 Open vSwitch 和 VLAN 标签实现网络隔离
  • Redis 性能数据解读与问题排查优化版
  • 基于Flask的防火墙知识库Web应用技术解析
  • python爬虫PyQt简介
  • 【QT5 多线程示例】信号量
  • C++学习笔记(二十九)——list
  • 【Linux网络-poll与epoll】epollserver设计(两个版本 Reactor)+epoll理论补充(LT ET)
  • vue ts+Windi CSS
  • CTFshow【命令执行】web29-web40 做题笔记
  • 未来工程项目管理新走向:云原生软件赋能绿色可持续建设
  • Kafka 面试备战指南
  • eureka与ribbon混合使用
  • Linux设置SSH免密码密钥登录
  • Netty和Project Reactor如何共同处理大数据流?
  • 无人机抗风测试技术要点概述!
  • failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析
  • LLaMA-Factory使用实战
  • Elasticsearch 之 ElasticsearchRestTemplate 聚合查询
  • Java版Manus实现来了,Spring AI Alibaba发布开源OpenManus实现