【cpp-httplib】 安装与使用

article/2025/7/3 12:28:19

cpp-httplib

  • 1. 介绍
  • 2. 安装
  • 3. 类与接口
    • 3.1 httplib请求
    • 3.2 httplib响应
    • 3.3 httplib服务端
    • 3.4 httplib客户端
  • 4. 使用
    • 4.1 服务端
    • 4.2 客户端

1. 介绍

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 有一个活跃的社区,不断有新的功能和改进被加入。

2. 安装

git clone https://github.com/yhirose/cpp-httplib.git

3. 类与接口

3.1 httplib请求

namespace httplib
{// 文件信息结构体struct MultipartFormData{std::string name;         // 字段名称std::string content;      // 文件内容std::string filename;     // 文件名称std::string content_type; // 文件类型};using MultipartFormDataItems = std::vector<MultipartFormData>;struct Request{std::string method;//请求方法std::string path;//请求资源路径Headers headers;//请求报头std::string body;//请求正文Params params;//查询字符串MultipartFormDataMap files;//保存的是客户端上传的文件信息Ranges ranges;//用于实现文件断点续传的请求文件区间 //判断请求报头中有没有某个字段bool has_header(const char *key) const;//获取请求报头中对应的字段值std::string get_header_value(const char *key, size_t id = 0) const;//将key-val的字段值设定在http请求中void set_header(const char *key, const char *val);//判断对应的文件name是否存在,主要判断MultipartFormData里面的name是否存在bool has_file(const char *key) const;//获取对应的文件信息MultipartFormData get_file_value(const char *key) const;};
}

3.2 httplib响应

struct Response
{std::string version;//响应版本int status = -1;//响应状态码std::string reason;Headers headers;//响应报头std::string body;//响应正文std::string location; // 重定向位置//设置正文内容+正文类型void set_content(const std::string &s,const std::string &content_type);//设置头部字段,以key val方式void set_header(const std::string &key,const std::string &val);
};

3.3 httplib服务端

class Server
{//Handler是对应请求资源路径的回调函数using Handler = std::function<void(const Request &, Response &)>;//Handlers是一个映射表,它映射的是请求资源路径和对应回调函数using Handlers = std::vector<std::pair<std::regex, Handler>>//对应方法设置对应请求路径和回调函数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);
};

在这里插入图片描述

Http请求对应每个请求方法都有自己的路由选择表。构建服务器的时候可以调用Server里面的Get(“/hello”,Hello),将请求方为GET,请求资源/hello,与函数Hello 注册 在Handlers表中。当http请求的请求方法是GET方法,且请求资源是/hello,那么服务器则会调用Hello函数,构建相对应的http响应。

3.4 httplib客户端

Get接口请求服务器对应请求路径的资源,请求成功后返回一个result值,这个值就是一个response类型,信息通过返回值进行获得。

post接口是上传一个文件信息给服务器,重载了两个函数,一个是通过MultipartFormData类型进行组织好文件内容,然后插入到MultipartFormDataItems数组中上传,这种方式是可以在一个请求中上传多个文件信息,另一个则是只针对一个文件信息上传。

class Client
{//构造一个客户端对象,传入服务器Ip地址和端口explicit Client(const std::string &host, int port);//向服务器发送GET请求Result Get(const std::string &path);Result Get(const std::string &path, const Headers &headers);//向服务器发送Post请求//path是路径//body是正文//content_type是正文的类型Result Post(const std::string &path, const std::string &body,const std::string &content_type);//以Post方法上传文件Result Post(const char *path, const MultipartFormDataItems &items);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);
};

4. 使用

4.1 服务端

#include<iostream>
#include"cpp-httplib/httplib.h"void Hi(const httplib::Request& req,httplib::Response& rsp)
{std::cout<<req.method<<std::endl;std::cout<<req.path<<std::endl;std::string res = "<html><body><h1>你好世界!</hi></body></html>";rsp.set_content(res,"text/html");}void File(const httplib::Request& req,httplib::Response& rsp)
{bool ret = req.has_file("file");if(ret == false){std::cout<<"文件不存在"<<std::endl;return;}auto file = req.get_file_value("file");std::cout<<file.name<<std::endl;std::cout<<file.filename<<std::endl;std::cout<<file.content<<std::endl;std::cout<<file.content_type<<std::endl;
}int main()
{httplib::Server server;server.Get("/Hi",Hi);server.Post("/File",File);server.listen("0.0.0.0",8080);return 0;
}

4.2 客户端

#include<iostream>
#include"cpp-httplib/httplib.h"int main()
{httplib::Client client("127.0.0.1",8080);auto result1 = client.Get("/Hi");if(result1 && result1->status == 200){std::cout<<result1->body<<std::endl;}else{std::cerr<<"No content return"<<std::endl;}httplib::MultipartFormData data;data.name = "file";data.filename = "upload";data.content = "upload content";data.content_type = "text/plain";httplib::MultipartFormDataItems items;items.push_back(data);auto result2 = client.Post("/File",items);if(result2 && result2->status == 200){std::cout<<result2->body<<std::endl;}else{std::cerr<<"upload error"<<std::endl;}return 0;
}
all:server clientservre:server.ccg++ -o $@ $^ -std=c++17 -lpthreadclient:client.ccg++ -o $@ $^ -std=c++17 -lpthread

http://www.hkcw.cn/article/uEMOuFQKpP.shtml

相关文章

HPE推出全新分布式服务交换机及有线无线产品组合,全面赋能AI与高性能计算需求

HPE Aruba Networking将分布式服务交换机性能全面升级,实现能力翻倍 休斯顿-2025年5月29日-慧与科技(NYSE:HPE)日前宣布全面扩展HPE Aruba Networking有线及无线网络产品组合,并重磅推出全新HPE Aruba Networking CX 10K分布式服务交换机。该系列交换机搭载AMD Pensando可编程…

烟草工业数字化转型:科技领航,重塑传统产业新生态

在科技浪潮席卷各行业的当下&#xff0c;烟草工业这一传统产业也迎来了深刻变革。《烟草工业数字化转型&#xff1a;科技领航&#xff0c;重塑传统产业新生态》这一主题&#xff0c;精准揭示了数字化技术如何在具有独特生产工艺与严格监管要求的烟草工业中&#xff0c;发挥关键…

单依纯《歌手》被吐槽像吃了跳跳糖 转型争议不断

2025年开春,单依纯这个名字在娱乐圈频繁出现。这个被称为“00后王菲”的女孩,在《歌手2025》的舞台上表现亮眼,但随之而来的争议也越来越多。有人称赞她的唱功,有人批评她“卖肉博眼球”。这些争论背后反映出两个问题:女艺人应该怎样生活,观众到底想看什么。回顾单依纯的…

断眉袭榜单依纯成功 青春DNA狂飙舞台

歌手2025第三期是袭榜赛,断眉作为袭榜者开场演唱了大热单曲《See You Again》,前奏一响即勾起观众的集体回忆,被评价为“青春DNA狂飙”的舞台。尽管部分观众认为其高音表现稍显吃力,但整体感染力仍获认可。接下来是歌手2025第三期出场顺序及淘汰名单:GAI周延第一个出场,演…

二维平面点集相似问题思考及优化

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题描述 如果两个点集可以通过平移&#xff0c;X轴对称&#xff0c;Y轴对称&#xff0c;中心对称得到相同的点集&#xff0c;则移两个点集相似。 给定多个点集&…

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 大数据篇 300&#xff1a; Hadoop&…

WebFuture:设置不自动删除操作日志

问题描述&#xff1a; 客户要求保留系统操作日期为1年 或者不删除 问题处理&#xff1a; 在平台安全配置中 将自动清理后台操作日志功能 选择为否&#xff0c;或者设置自动清理的时间为365天

国产高安全芯片在供应链自主可控中的综合优势与案例分析

摘要&#xff1a;本文深入探讨了国产高安全芯片在实现供应链自主可控中的关键作用&#xff0c;通过分析国科安芯的 AS32A601、ASM1042、ASP3605 和 ASP4644 芯片的技术特性&#xff0c;结合其在工业控制、汽车电子、航天航空和电力系统等领域的应用场景&#xff0c;系统阐述了国…

Sigma-Aldrich3D细胞培养支架有哪些类型?

体内生长的哺乳动物细胞处于复杂的三维&#xff08;3D&#xff09;环境中。围绕在细胞周围的细胞外基质&#xff08;ECM&#xff09;的形状和化学组成能够决定许多生理反应。传统的细胞培养技术和实验方案在通常由玻璃或聚苯乙烯制成的二维&#xff08;2D&#xff09;表面上进行…

【开发心得】AstrBot对接飞书失败的问题探究

飞书与AstrBot的集成使用中&#xff0c;偶尔出现连接不稳定的现象。尽管不影响核心功能&#xff0c;但为深入探究技术细节并推动后续优化&#xff0c;需系统性记录该问题。先从底层通信机制入手&#xff0c;分析连接建立的逻辑与数据交互流程。基于实际现象&#xff0c;明确问题…

低功耗可编程RTU 在供水管网监控中的应用

1.1 智慧水务之管网 供水管网监控系统适用于供水企业实施供水管网的远程监测&#xff0c;工作人员在调度中心远程监测供水管网的压力及流量情况&#xff0c;可以对远程现场的运行设备进行监控&#xff0c;以实现管道压力、水流量的数据传送及阀门开关的自动管制&#xff…

RK3568 OH5.1 编译运行程序hellworld

编写helloworld 代码根目录创建sample子系统文件夹在子系统目录下创建hello部件文件夹hello文件夹中创建hello源码目录及源码 sample/hello/src/helloworld.c&#xff1a; #include <stdio.h> #include "helloworld.h"void hello_oh(void);int main(int arg…

LangChain-结合魔塔社区modelscope的embeddings实现搜索

首先要安装modelscope pip install modelscope 安装完成后测试 from langchain_community.embeddings import ModelScopeEmbeddingsembeddings ModelScopeEmbeddings(model_id"iic/nlp_gte_sentence-embedding_chinese-base")text "这是一个测试句子"…

千库/六图素材下载工具

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORW9TbxC9Lmz8gCynFrgdBzA1?pwdxiut# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/829e2a4085d3 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

老板发百万让员工带薪收麦子 暖心福利获赞

5月23日,河南长垣的河南省矿山起重机有限公司内举行了一场特别的“三夏”生产动员暨表彰大会。公司董事长崔培军在会上宣布了一项暖心措施:他现场拿出360万元现金,每位员工都收到了700元现金、一袋小米和4箱啤酒作为“三夏”福利。崔培军表示,正值“三夏”大忙季节,考虑到…

加沙的孩子没有儿童节 战火中的无辜伤亡

5月27日,联合国儿童基金会称,自2023年10月本轮巴以冲突爆发以来,加沙已有超过5万名儿童伤亡,当地被形容为人间地狱。英国外交官卡里乌基表示,加沙已成为世界上儿童生存最危险的地方。据半岛电视台报道,平均每45分钟就有一名孩子死去。战前,加沙人口约230万,其中一半是1…

何为新消费时代的“情绪价值逻辑” 品牌业绩与股价双开花

胖东来、泡泡玛特、老铺黄金等品牌不仅在社交媒体上频繁出现,还实现了业绩与股价的双重增长。这种现象背后是情绪消费时代的崛起。国金证券最新研究报告指出,随着中国居民人均可支配收入的提升,消费需求正从功能性向情感性转移,情绪价值消费成为消费行业的重要趋势。预计到…

当越来越多明星签下那则道德条款 娱乐圈的道德锁链

明星道德条款起源于百年前的美国派拉蒙电影公司。当时,一位与派拉蒙签约的艺人涉嫌谋杀强奸被逮捕,尽管最终被判无罪,但项目因此受到抵制,派拉蒙从此在艺人合同中加入了道德条款。近年来,在中国影视行业中,道德条款也逐渐成为明星和剧组工作人员必须遵守的准则。它禁止的…

Grace被断眉唱哭了 断眉袭榜成功

5月30日晚,《歌手2025》第三期播出,共有8名歌手参加比赛。查理普斯作为首位袭榜歌手登场。排名如下: - 第一名:格瑞丝金斯勒 - 第二名:单依纯 - 第三名:米奇盖顿 - 第四名:GAI周延 - 第五名:陈楚生 - 第六名:马嘉祺 - 第七名:白举纲根据规则,若袭榜歌手获胜,本场竞…

俄代表遭死亡威胁?克宫:骇人听闻 梅金斯基家人成目标

克里姆林宫发言人佩斯科夫表示,针对俄总统助理、俄乌谈判俄方代表团团长梅金斯基及其家人的死亡威胁如果得到证实,将是骇人听闻的。俄方已开始调查威胁来源。此前,俄电视节目主持人索洛维约夫称,梅金斯基收到了来自乌克兰方面的死亡威胁,其家人也成为目标。本月早些时候,…