【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
繁體地址,請注明出處:http://hk.pswp.cn/news/907522.shtml
英文地址,請注明出處:http://en.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…