【cpp-httplib】 安装与使用

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.pswp.cn/news/907522.shtml

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

相关文章

Electron-vite【实战】MD 编辑器 -- 系统菜单(含菜单封装,新建文件,打开文件,打开文件夹,保存文件,退出系统)

最终效果 整体架构 src/main/index.ts import { createMenu } from ./menu在 const mainWindow 后 // 加载菜单createMenu(mainWindow)src/main/menu.ts import { BrowserWindow, Menu, MenuItem, MenuItemConstructorOptions, dialog, shell } from electron import fs from…

【第4章 图像与视频】4.5 操作图像的像素

文章目录 前言示例-获取和修改图像数据图像数据的遍历方式图像滤镜负片滤镜黑白滤镜浮雕滤镜filter滤镜属性 前言 getImageData() 与 putImageData() 这两个方法分别用来获取图像的像素信息&#xff0c;以及向图像中插入像素。与此同时&#xff0c;如果有需要&#xff0c;也可…

【Docker 从入门到实战全攻略(一):核心概念 + 命令详解 + 部署案例】

1. 是什么 Docker 是一个用于开发、部署和运行应用程序的开源平台&#xff0c;它使用 容器化技术 将应用及其依赖打包成独立的容器&#xff0c;确保应用在不同环境中一致运行。 2. Docker与虚拟机 2.1 Docker&#xff08;容器化&#xff09; 容器化是一种轻量级的虚拟化技术…

Vue:axios(POST请求)

发送 POST 请求 基本用法 axios.post(/api/login, {username: lcyyyy,password: 123456 }) .then(response > {console.log(请求成功:, response.data); }) .catch(error > {console.error(请求失败:, error); });在 Vue 组件中使用 export default {methods: {async …

一周学会Pandas2之Python数据处理与分析-数据重塑与透视-unstack() - 解堆 (行 -> 列)

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili unstack() 是 pandas 中用于数据重塑的重要方法&#xff0c;它与 stack() 互为逆操作。unstack() 的主要功能是将行索…

基于大模型预测的FicatIII-IV期股骨头坏死综合治疗研究报告

目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究意义和创新点 二、FicatIII-IV 期股骨头坏死概述 2.1 疾病定义与分期 2.2 病因与病理机制 2.3 临床症状与诊断方法 三、大模型预测原理与方法 3.1 大模型简介 3.2 数据收集与预处理 3.3 模型训练与优…

C++?多态!!!

一、引言 众所周知&#xff0c;C有三大特性&#xff0c;它们分别是封装、继承和多态&#xff0c;在之前的文章中已经详细介绍过封装和继承了&#xff0c;今天我们将一起学习多态相关的知识&#xff0c;如果还想了解封装、继承相关的知识&#xff0c;可以跳转到以下链接&#xf…

electron安装报错处理

electron安装报错 解决方法&#xff1a; 修改 C:\Users\用户名.npmrc下配置文件 添加代码 electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-builder-binaries/最后代码 registryhtt…

Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速

Windows10下使用QEMU安装Ubuntu20.04虚拟机&#xff0c;并启用硬件加速 作者将狼才鲸创建日期2025-05-30 CSDN阅读地址&#xff1a;Windows10下使用QEMU安装Ubuntu20.04虚拟机&#xff0c;并启用硬件加速 本文档源码地址&#xff1a;Windows10下使用QEMU安装Ubuntu20.04虚拟机…

顶刊SCS | 基于视觉语言大模型推理分割的建筑足迹尺度功能分类, 样本数据和代码已开源!

论文介绍 题目&#xff1a;Visual-language reasoning segmentation (LARSE) of function-level building footprint across Yangtze River Economic Belt of China 期刊&#xff1a;Sustainable cities and society&#xff08;中科院一区TOP&#xff0c;IF10.5&#xff09;…

【软件】navicat 官方免费版

Navicat Premium Lite https://www.navicat.com.cn/download/navicat-premium-lite

每个路由器接口,都必须分配所属网络内的 IP 地址,用于转发数据包

在IP网络中&#xff0c;主机&#xff08;Host&#xff09;和路由器接口&#xff08;Router Interface&#xff09;都需要分配网络地址&#xff08;IP地址&#xff09;。 1. 主机&#xff08;Host&#xff09;的IP地址分配 (1) 作用 主机的IP地址用于唯一标识该设备&#xff0…

鸿蒙OSUniApp页面切换动效实战:打造流畅精致的转场体验#三方框架 #Uniapp

UniApp页面切换动效实战&#xff1a;打造流畅精致的转场体验 引言 在移动应用开发中&#xff0c;页面切换动效不仅能提升用户体验&#xff0c;还能传达应用的品质感。随着HarmonyOS的普及&#xff0c;用户对应用的动效体验要求越来越高。本文将深入探讨如何在UniApp中实现流畅…

Tesseract OCR 安装与中文+英文识别实现

一、下载 https://digi.bib.uni-mannheim.de/tesseract/ 下载&#xff0c;尽量选择时间靠前的&#xff08;识别更好些&#xff09;。符合你的运行机&#xff08;我的是windows64&#xff09; 持续点击下一步安装&#xff0c;安装你认可的路径即可&#xff0c;没必要配置环境变…

Visual Studio 2022 发布独立的 exe 文件

我们在用 Visual Studio 2022 写好一个 exe 程序之后&#xff0c;如果想把这个拿到其他地方运行&#xff0c;需要把 exe 所在的文件夹一起拿过去。 编译出来的 exe 文件需要其他几个文件一同放在同一目录才能运行&#xff0c;原因在于默认情况下&#xff0c;Visual Studio 是把…

Kotlin-特殊类型

文章目录 数据类型枚举类型匿名类和伴生对象单例类伴生对象 数据类型 声明一个数据类非常简单: //在class前面添加data关键字表示为一个数据类 data class Student(var name: String, var age: Int)数据类声明后,编译器会根据主构造函数中声明的所有属性自动为其生成以下函数…

在线博客系统【测试报告】

&#x1f552; 一. 项目背景 由于纸质笔记容易丢失&#xff0c;携带不变&#xff0c;为了方便自己学习的过程中记录笔记&#xff0c;特开发了这个博客系统。这个系统后端采用 SpringBoot MyBatis SpringMVC &#xff1b;前端使用Html CSS JS&#xff1b;数据库使用的是Mysq…

每日刷题c++

快速幂 #include <iostream> using namespace std; #define int long long int power(int a, int b, int p) {int ans 1;while (b){if (b % 2){ans * a;ans % p; // 随时取模}a * a;a % p; // 随时取模b / 2;}return ans; } signed main() {int a, b, p;cin >> a …

Python中的变量、赋值及函数的参数传递概要

Python中的变量、赋值及函数的参数传递概要 python中的变量、赋值 python中的变量不是盒子。 python中的变量无法用“变量是盒子”做解释。图说明了在 Python 中为什么不能使用盒子比喻&#xff0c;而便利贴则指出了变量的正确工作方式。 如果把变量想象为盒子&#xff0c;那…

KVM 安装 Ubuntu 22

在 KVM 中安装 Ubuntu 22 虚拟机。 首先创建硬盘文件 sudo qemu-img create -f qcow2 /app/vms/ubuntu22.qcow2 100G安装Ubuntu 22 sudo virt-install \--name ubuntu22 \--ram 4096 \--vcpus 2 \--disk path/app/vms/ubuntu22.qcow2,formatqcow2 \--os-type linux \--os-va…