Muduo網絡庫實現 [十三] - HttpRequest模塊

目錄

設計思路?

成員設計

模塊實現


設計思路?

首先我們要先知道HTTP的請求的流程是什么樣子的,不然我們會學的很迷糊。對于HTTP請求如何到來以及去往哪里,我們應該很清楚的知道

HTTP請求在服務器系統中的傳遞流程是一個多層次的過程:

  1. 客戶端發起請求 - 用戶在瀏覽器或應用中發起HTTP請求
  2. 網絡傳輸 - 請求通過網絡傳輸到服務器
  3. 服務器接收 - 服務器的TCP/IP協議棧接收數據包并將其傳遞給操作系統
  4. 網絡庫接收 - 在muduo這樣的網絡庫中,數據通過以下路徑流動:
    • 操作系統的socket接口接收原始數據
    • 網絡庫的EventLoop檢測到socket可讀事件
    • TcpConnection將數據讀入其內部Buffer
  5. HTTP解析 - 數據進入HTTP解析層:
    • TcpServer將連接和數據傳遞給HttpServer
    • HttpServer創建HttpContext對象處理每個連接
    • HttpContext從Buffer中讀取數據并進行解析
    • 解析結果存儲在HttpRequest對象中
  6. 應用處理 - 最終HttpRequest被傳遞給用戶注冊的回調函數進行業務邏輯處理

HttpRequest通常由HttpContext創建和填充,然后傳遞給處理HTTP請求的回調函數或處理器。它本質上是HTTP請求信息的容器,使服務器能夠方便地訪問和處理客戶端的請求內容。

在整個HTTP處理流程中,HttpRequest的角色是保存從網絡層解析出的HTTP請求信息,供應用層使用。

HTTP請求格式

成員設計

HTTP請求中的主要要素包括:

  1. 請求行:
    • 請求方法(GET、POST、PUT、DELETE等)
    • URL,包含:
      • 資源路徑
      • 查詢參數(鍵值對形式)
    • 協議版本(如HTTP/1.1)
  2. 請求頭部:
    • 多個鍵值對格式的頭部字段
    • 常見的如Content-Type、User-Agent、Host等
  3. 請求正文:
    • 根據Content-Length或Transfer-Encoding確定長度
    • 內容格式由Content-Type決定

首先請求行中,有請求方法,url ,協議版本,而url中又分為資源路徑和參數,參數是kv的形式,所以我們需要使用一個map來保存

而請求頭部中,都是一些kv格式的屬性,我們也是使用一個map來保存

最后就是正文部分,正文部分是交給上層業務邏輯去處理的,我們只需要按照請求頭部中的Content-Length提取出來就行了。

那么我們需要保存的就是 : 請求方法,資源路徑,參數,協議版本,頭部字段,正文 ,當然,由于可能會存在中間的處理過程,比如對請求行的解析,我們會使用正則表達式來進行,我們可以再存儲一個 std::smatch 來保存正則提取出來的結果。

由于HttpRequest后續我們是交給 上下文模塊來進行設置的,為了方便,我們就直接將成員設置為公有的了,便于直接訪問。

同時,對于參數和請求頭部,我們可以提供結構,用來插入kv形式的參數和請求頭部,以及查詢是否有某個參數或者請求頭部。

再HttpRequest的頭部字段中,有一個很重要的信息就是正文長度,我們可以提供一個接口用來獲取正文長度。

最后再提供一個接口用于判斷長短連接,長短連接后續我們會用到。

然后如果是短連接的話,我們每次接收完也需要把數據給清除了。所以也需要個接口

模塊實現

代碼挺簡單的,跟著思路走就很容易寫出來的

class HttpRequest
{
public:string _method;  //存儲請求方法string _path;    //存儲資源路徑string _version;  //存儲協議版本string _body;    //存儲正文unordered_map<string, string> _headers;   //存儲請求頭部unordered_map<string, string> _params;  //存儲查詢字符串smatch _matches; //資源路徑正則提取
private:bool HasHeader(const sting &key) const  //給獲取報文長度函數提供的{auto it = _headers.find(key);if(it == _headers.end()){return false;}return it->second;}string GetHeader(const sting &key) const //給獲取報文長度函數提供的{auto it = _headers.find(key);if(it == _headers.end()){return "";}return it->second;}public:HttpRequest():_version("HTTP/1.1"){}void clear()//清空類數據{_method.clear();_path.clear();_version("HTTP/1.1");_body.clear();_headers.clear();_params.clear();smatch matches;_matches.swap(matches);}void SetHeader(const string &key, const string &val)//添加請求頭部{_headers.insert(key, val);}void SetParam(const string &key, const string &val)//添加查詢字符串{_params.insert(key, val);}size_t GetLength()//獲取正文長度{bool ret = HasHeader("Content-Length");if(ret == false){return 0;}string len = GetHeader("Content-Length");return stol(len);}//是否是短鏈接bool Close() const{if(HasHeader("Connection") == true && GetHeader("Connection") == "keep-alive");{return false;}return true;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75594.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6. RabbitMQ 死信隊列的詳細操作編寫

6. RabbitMQ 死信隊列的詳細操作編寫 文章目錄 6. RabbitMQ 死信隊列的詳細操作編寫1. 死信的概念2. 消息 TTL 過期(觸發死信隊列)3. 隊列超過隊列的最大長度(觸發死信隊列)4. 消息被拒(觸發死信隊列)5. 最后&#xff1a; 1. 死信的概念 先從概念上解釋上搞清楚這個定義&#…

如何使用Selenium進行自動化測試?

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 對于很多剛入門的測試新手來說&#xff0c;大家都將自動化測試作為自己職業發展的一個主要階段。可是&#xff0c;在成為一名合格的自動化測試工程師之前&#…

洛谷題單3-P5724 【深基4.習5】求極差 最大跨度值 最大值和最小值的差-python-流程圖重構

題目描述 給出 n n n 和 n n n 個整數 a i a_i ai?&#xff0c;求這 n n n 個整數中的極差是什么。極差的意思是一組數中的最大值減去最小值的差。 輸入格式 第一行輸入一個正整數 n n n&#xff0c;表示整數個數。 第二行輸入 n n n 個整數 a 1 , a 2 … a n a_1,…

STM32智能手表——任務線程部分

RTOS和LVGL我沒學過&#xff0c;但是應該能硬啃這個項目例程 ├─Application/User/Tasks # 用于存放任務線程的函數 │ ├─user_TaskInit.c # 初始化任務 │ ├─user_HardwareInitTask.c # 硬件初始化任務 │ ├─user_RunModeTasks.c…

ubuntu22.04LTS設置中文輸入法

打開搜狗網址直接下載軟件&#xff0c;軟件下載完成后&#xff0c;會彈出安裝教程說明書。 網址:搜狗輸入法linux-首頁搜狗輸入法for linux—支持全拼、簡拼、模糊音、云輸入、皮膚、中英混輸https://shurufa.sogou.com/linux

SQL Server數據庫異常-[SqlException (0x80131904): 執行超時已過期] 操作超時問題及數據庫日志已滿的解決方案

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;獲得2024年博客之星榮譽證書&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發技術&#xff0c…

php8 ?-> nullsafe 操作符 使用教程

簡介 PHP 8 引入了 ?->&#xff08;Nullsafe 操作符&#xff09;&#xff0c;用于簡化 null 檢查&#xff0c;減少繁瑣的 if 語句或 isset() 代碼&#xff0c;提高可讀性。 ?-> Nullsafe 操作符的作用 在 PHP 7 及以下&#xff0c;訪問對象的屬性或方法時&#xff0…

WORD+VISIO輸出PDF圖片提高清晰度的方法

WORDVISIO輸出PDF圖片提高清晰度的方法 part 1: visio 繪圖part 2: word 導出 part 1: visio 繪圖 先在visio中把圖片和對應的文字調整為適合插入到文章中的尺寸&#xff1b; 在visio中把所有元素進行組合&#xff1b; 把組合后的圖片長和寬等比例放縮&#xff0c;如放大10倍…

重要頭文件下的函數

1、<cctype> #include<cctype>加入這個頭文件就可以調用以下函數&#xff1a; 1、isalpha(x) 判斷x是否為字母 isalpha 2、isdigit(x) 判斷x是否為數字 isdigit 3、islower(x) 判斷x是否為小寫字母 islower 4、isupper(x) 判斷x是否為大寫字母 isupper 5、isa…

基于大模型預測不穩定性心絞痛的多維度研究與應用

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的 1.3 國內外研究現狀 二、不穩定性心絞痛概述 2.1 定義與分類 2.2 發病機制 2.3 臨床表現 三、大模型技術原理與應用基礎 3.1 大模型介紹 3.2 在醫療領域的應用現狀 3.3 用于不穩定性心絞痛預測的可行性 四、術前預…

第一講—函數的極限與連續(一)

思維導圖 筆記 雙曲正弦函數及其反函數

Mac VM 卸載 win10 安裝win7系統

卸載 找到相應直接刪除&#xff08;移動到廢紙簍&#xff09; 可參考&#xff1a;mac如何卸載虛擬機win 下載 win7下載地址

免費送源碼:Java+SSM+Android Studio 基于Android Studio游戲搜索app的設計與實現 計算機畢業設計原創定制

摘要 本文旨在探討基于SSM框架和Android Studio的游戲搜索App的設計與實現。首先&#xff0c;我們詳細介紹了SSM框架&#xff0c;這是一種經典的Java Web開發框架&#xff0c;由Spring、SpringMVC和MyBatis三個開源項目整合而成&#xff0c;為開發企業級應用提供了高效、靈活、…

網絡安全的現狀與防護措施

隨著數字化和信息化的迅猛發展&#xff0c;互聯網已成為人們日常生活、工作和學習不可或缺的一部分。然而&#xff0c;隨著網絡技術的普及&#xff0c;網絡安全問題也日益突出。近年來&#xff0c;數據泄露、惡意軟件、網絡攻擊等事件層出不窮&#xff0c;給企業和個人帶來了巨…

android databinding使用教程

Android DataBinding 是一種可以將 UI 組件與數據源綁定的框架&#xff0c;能夠減少 findViewById 的使用&#xff0c;并提高代碼的可維護性。下面是 DataBinding 的完整使用教程&#xff1a; 1. 啟用 DataBinding 在 build.gradle&#xff08;Module 級別&#xff09;中啟用 …

python如何快速刪除文件夾中的大量文件

在 Python 中&#xff0c;刪除文件夾中的大量小圖片文件可以通過使用 os 模塊或 shutil 模塊來實現。以下是一個示例代碼&#xff0c;展示了如何快速刪除指定文件夾中的所有文件。如果你只需要刪除小圖片文件&#xff0c;可以添加額外的邏輯來檢查文件大小。 以下是一個示例代…

如何使用 IntelliJ IDEA 開發命令行程序(或 Swing 程序)并手動管理依賴(不使用 pom.xml)

以下是詳細步驟&#xff1a; 1. 創建項目 1.1 打開 IntelliJ IDEA。 1.2 在啟動界面&#xff0c;點擊 Create New Project&#xff08;創建新項目&#xff09;。 1.3 選擇 Java&#xff0c;然后點擊 Next。 1.4 確保 Project SDK 選擇了正確的 JDK 版本&#x…

FastAPI-Cache2: 高效Python緩存庫

FastAPI-Cache2是一個強大而靈活的Python緩存庫&#xff0c;專為提升應用性能而設計。雖然其名稱暗示與FastAPI框架的緊密集成&#xff0c;但實際上它可以在任何Python項目中使用&#xff0c;為開發者提供簡單而高效的緩存解決方案。 在現代應用開發中&#xff0c;性能優化至關…

android開發:zxing-android-embedded豎屏掃描功能

Android 點擊按鈕調用豎屏二維碼掃描 提示&#xff1a;zxing-android-embedded插件已過時&#xff0c;建議更換別的。 場景&#xff1a;Home頁面上有個掃描按鈕&#xff0c;點擊后打開攝像頭完成掃描功能&#xff0c;掃描時要求豎屏。 方案&#xff1a;使用zxing-android-embe…

指令補充+樣式綁定+計算屬性+監聽器

一、指令補充 1. 指令修飾符 1. 作用: 借助指令修飾符, 可以讓指令更加強大 2. 分類: 1> 按鍵修飾符: 用來檢測用戶的按鍵, 配合鍵盤事件使用. keydown 和 keyup 語法: keydown.enter/v-on:keydown.enter 表示當enter按下的時候觸發 keyup.enter/v-on:keyup.enter 表示當…