C++编程: 基于cpp-httplib和nlohmann/json实现简单的HTTP Server

文章目录

    • 0. 引言
    • 1. 完整实例代码
    • 2. 关键实现
    • 3. 运行与测试

0. 引言

本文基于 cpp-httplibnlohmann/json 实现简单的 HTTPS Server 实例代码,这两个库均是head-only的。

1. 完整实例代码

如下实例程序修改自example/server.cc

#include <httplib.h>#include <chrono>
#include <cstdio>
#include <nlohmann/json.hpp>using namespace httplib;
using json = nlohmann::json;#define SERVER_CERT_FILE "./cert.pem"
#define SERVER_PRIVATE_KEY_FILE "./key.pem"json dump_headers_json(const Headers &headers) {json j;for (const auto &x : headers) {j[x.first] = x.second;}return j;
}json log_json(const Request &req, const Response &res) {json j;j["request"]["method"] = req.method;j["request"]["version"] = req.version;j["request"]["path"] = req.path;json query_params = json::object();for (const auto &x : req.params) {query_params[x.first] = x.second;}j["request"]["query_params"] = query_params;j["request"]["headers"] = dump_headers_json(req.headers);j["response"]["status"] = res.status;j["response"]["version"] = res.version;j["response"]["headers"] = dump_headers_json(res.headers);j["response"]["body"] = res.body;return j;
}int main(void) {
#ifdef CPPHTTPLIB_OPENSSL_SUPPORTSSLServer svr(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE);
#elseServer svr;
#endifif (!svr.is_valid()) {printf("server has an error...\n");return -1;}svr.Get("/", [=](const Request & /*req*/, Response &res) { res.set_redirect("/hi"); });svr.Get("/hi", [](const Request & /*req*/, Response &res) { res.set_content("Hello World!\n", "text/plain"); });svr.Get("/slow", [](const Request & /*req*/, Response &res) {std::this_thread::sleep_for(std::chrono::seconds(2));res.set_content("Slow...\n", "text/plain");});svr.Get("/dump", [](const Request &req, Response &res) {json headers_json = dump_headers_json(req.headers);res.set_content(headers_json.dump(4), "application/json");});svr.Get("/stop", [&](const Request & /*req*/, Response & /*res*/) { svr.stop(); });svr.set_error_handler([](const Request & /*req*/, Response &res) {json j;j["error"]["status"] = res.status;j["error"]["message"] = "An error occurred.";res.set_content(j.dump(4), "application/json");});svr.set_logger([](const Request &req, const Response &res) {json log_data = log_json(req, res);printf("%s\n", log_data.dump(4).c_str());});svr.listen("localhost", 8080);return 0;
}

2. 关键实现

  • 自签名证书(开发/测试用途)

    SSL 服务器需要证书和私钥文件。使用 OpenSSL 生成一个自签名证书:

    openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
    

文件说明

- `cert.pem`:服务器的自签名证书,包含公钥。
- `key.pem`:服务器的私钥,用于加密。
  • 配置 SSL Server
    httplib 提供了 SSLServer 类,配置方法如下:

    SSLServer svr(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE);
    
    • SERVER_CERT_FILE:证书文件路径。
    • SERVER_PRIVATE_KEY_FILE:私钥文件路径。
  • JSON 格式化响应
    使用 nlohmann/json 将数据格式化为 JSON:

    res.set_content(headers_json.dump(4), "application/json");
    
    • headers_json.dump(4):将 JSON 对象格式化为字符串,缩进 4 空格。
  • 日志记录
    将每次请求和响应记录为 JSON 格式的日志:

    svr.set_logger([](const Request &req, const Response &res) {json log_data = log_json(req, res);printf("%s\n", log_data.dump(4).c_str());
    });
    
  • 错误处理
    自定义错误响应:

    svr.set_error_handler([](const Request & /*req*/, Response &res) {json j;j["error"]["status"] = res.status;j["error"]["message"] = "An error occurred.";res.set_content(j.dump(4), "application/json");
    });
    

3. 运行与测试

  • 编译代码
    确保链接 nlohmann/jsonhttplib

    g++ server.cpp -o server -std=c++14 -lssl -lcrypto
    
  • 运行服务

    ./server
    
  • 测试 API
    使用 curl 测试:

    $ curl -k https://localhost:8080/dump                                                                                                                                                
    {"Accept": "*/*","Host": "localhost:8080","LOCAL_ADDR": "127.0.0.1","LOCAL_PORT": "8080","REMOTE_ADDR": "127.0.0.1","REMOTE_PORT": "41542","User-Agent": "curl/7.68.0"
    }% 
    

    参数说明:

    • -k:忽略自签名证书的警告。
  • 在浏览器上打开
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489783.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收银pos源代码(Win版+安卓版)

1.收银pos版本 支持市面上主流系统版本&#xff0c;如支持win版&#xff08;exe安装包&#xff09;、安卓版&#xff08;apk安装包&#xff09;&#xff1b; 2.多样化收银 支持Windows收银机、安卓收银机、ai智能称重、收银称重一体机、无人自助收银、手机端收银等&#xff…

springboot项目如何运行起来

时常开发好的springboot项目是如何运行起来的&#xff1f; 经常会使用到打包插件spring-boot-maven-plugin SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可&#xff1a; org.springframework.boot spring-b…

ubuntu18.04配置实时内核

ubuntu系统&#xff1a;18.04 当前内核&#xff1a;5.4.0-84-generic 待安装实时内核&#xff1a; 5.6.19-rt11 1、查看当前版本 uname -r 2、下载内核与补丁 一种方式从官网自己下载 官方内核下载地址官方补丁下载地址阿里镜像内核下载地址&#xff08;速度快&#xff0…

Centos7环境下安装Flink1.20

目录 介绍1、涉及安装包2、节点3、修改hostname4、将flink安装包上传并解压5、修改配置文件6、修改masters和workers&#xff08;所有节点&#xff09;7、集群启停 介绍 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的…

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值&#xff1a; 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析&#xff0c;中国&#xff0c;李宗璋用EXCEL学统计学&#xff0c;日EXCEL统计分析与决策&#x…

深入解析Vue3响应式系统:从Proxy实现到依赖收集的核心原理

深入解析Vue3响应式系统&#xff1a;从Proxy实现到依赖收集的核心原理 响应式系统的基本原理 作为一个热门的JavaScript框架&#xff0c;Vue在3.x版本中引入了基于Proxy的响应式系统。这个系统的核心思想是利用Proxy对象拦截对数据的访问和修改&#xff0c;从而实现数据的自动更…

Visual Studio 2022 安装和管理 GitHub Copilot

文章目录 前言一、&#x1f6e0;️安装 GitHub Copilot1.1 安装 GitHub Copilot Chat1.2 使用 Visual Studio 安装程序进行安装1.3 使用“管理扩展”对话框进行安装&#xff08;推荐&#xff09; 二、&#x1f3ad;管理 Copilot 状态2.1 Copilot 处于活动状态2.2 Copilot 处于非…

git企业的使用详细命令行操作

git是Linux创始人通过内核开发而创作的分布式版本的控制系统&#xff0c;而我们作为开发者需要开发与维护&#xff0c;避免不了版本的迭代和更新&#xff0c;git就是用来保存修改删除等操作的工具&#xff0c;可以记录代码改动情况&#xff0c;它能够保存代码的每个版本&#x…

高中数学:随机变量-二项分布与超几何分布(独立重复实验)

文章目录 一、二项分布伯努利实验概率公式均值与方差公式归纳例题 二、超几何分布定义均值例题 一、二项分布 伯努利实验 概率公式 补充&#xff1a;二项式定理 均值与方差公式 归纳 例题 二、超几何分布 定义 均值 证明 例题

【Leetcode】滑动窗口算法-编程苍穹下划破数据暗夜的高效光弧

前言 &#x1f31f;&#x1f31f;本期讲解关于滑动窗口问题~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不多说直接…

go-zero(十二)消息队列

go zero 消息队列 在微服务架构中&#xff0c;消息队列主要通过异步通信实现服务间的解耦&#xff0c;使得各个服务可以独立发展和扩展。 go-zero中使用的队列组件go-queue&#xff0c;是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。 一、…

Django基础之模板

一.前言 前面我们讲了视图&#xff0c;我们今天来讲一下模板&#xff0c;模板其实也就是视图中render返回的html进行的渲染&#xff0c;然后展示到浏览器页面上去&#xff0c;那我们今天就来和大家来说一下模板的基本用法 二.寻找html模板 这个也就是我们前面说了的找html&a…

基于回溯法解决八皇后问题+以位运算方法优化n皇后问题(算法与数据结构期末设计)

文章目录 基于回溯法解决八皇后问题以位运算方法优化n皇后问题1. 八皇后问题问题描述2.回溯法求八皇后&#xff08;n皇后&#xff09;问题①由四皇后问题引入②皇后的占位问题③皇后的放置过程④放置过程中的问题⑤回溯算法核心⑥回溯算法的求解过程⑦验证算法和代码实现LeetCo…

Linux - MySQL迁移至一主一从

Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL&#xff0c;请参考Linux - MySQL安装&#xff0c;迁移数据量比较大约400G左右且网络不通故使用文件迁移&#xff0c;需开启一段时间…

PaddleOCR模型ch_PP-OCRv3文本检测模型研究(一)骨干网络

从源码上看&#xff0c;PaddleOCR一共支持四个版本&#xff0c;分别是PP-OCR、PP-OCRv2、PP-OCRv3、PP-OCRv4。本文选择PaddleOCR的v3版本的骨干网络作为研究对象&#xff0c;力图探究网络模型的内部结构。 文章目录 研究起点卷归层压发层残差层骨干网代码实验小结 研究起点 参…

数据结构——栈的模拟实现

大家好&#xff0c;今天我要介绍一下数据结构中的一个经典结构——栈。 一&#xff1a;栈的介绍 与顺序表和单链表不同的是&#xff1a; 顺序表和单链表都可以在头部和尾部插入和删除数据&#xff0c;但是栈的结构就锁死了&#xff08;栈的底部是堵死的&#xff09;栈只能从…

Ubuntu 安装 Samba Server

在 Mac 上如何能够与Ubuntu 服务器共享文件夹&#xff0c;需要在 Ubuntu 上安装 Samba 文件服务器。本文将介绍如何在 Ubuntu 上安装 Samba 服务器从而达到以下目的&#xff1a; Mac 与 Ubuntu 共享文件通过用户名密码访问 安装 Samba 服务 sudo apt install samba修改配置文…

Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值

MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB&#xff0c;我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上&#xff0c;包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户&#xff0c…

计算机组成原理与系统结构——微程序控制

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 基本概念 微指令 将控制单元实现为基本逻辑单元之间的互连并非易事&#xff0c;且设计相对呆板&#xff0c;难以灵活地改变&#xff0c;因此实现微程序控制…

CUDA算子手撕与面试指南

引言 最近秋招落幕&#xff0c;期间一直在找高性能计算&#xff08;HPC&#xff09;相关岗位&#xff0c;整理了一些CUDA算子手撕的代码和知识点分享给大家。 项目地址&#xff1a;https://github.com/Tongkaio/CUDA_Kernel_Samples 如果觉得本项目对你有帮助&#xff0c;欢…