HTTP拾技雜談

HTTP拾技雜談

簡單聊聊HTTP中的那些東西


文章目錄

  • HTTP拾技雜談
  • 前言
  • HTTP協議
    • 1.請求從客戶端到服務器端的4個步驟
      • 一般客戶端請求如下:
      • 服務端響應如下
    • 2.Keep-Alive
    • HTTP方法
    • Cookie
  • 總結


前言

超文本傳輸協議(Hypertext Transfer Protocol ,HTTP)是一個標準,定義了Web客戶端如何與服務器對話,以及數據如何從服務器傳回客戶端。盡管通常任務HTTP是一種傳輸HTML文件以及文件中內嵌圖片的方法,但實際上HTTP是一個數據格式。——《java網絡編程》


HTTP協議

HTTP連接使用TCP/IP來傳輸數據。

1.請求從客戶端到服務器端的4個步驟

  1. 默認情況下,客戶端在80端口與服務器打開一個TCP連接,URL可以指定其他端口
  2. 客戶端向服務器發送消息,請求指定路徑上的資源。請求分為首部、可選地址、請求數據。
  3. 服務器向客戶端回復響應。以響應碼開頭,后面是包含元數據的首部、一個空行、所請求的文檔(數據)或錯誤消息。
  4. 服務器關閉連接。
    以上就是基本HTTP1.0過程,在HTTP1.1及以后版本中,可以復用TCP連接實現發送多個請求。在1.1中請求和響應可以分為多個塊發送。

一般客戶端請求如下:

POST /api/data HTTP/1.1          # 請求行(方法 + URI + HTTP版本)
Host: www.example.com            # 目標主機(必需首部)
User-Agent: Mozilla/5.0          # 客戶端標識
Content-Type: application/json   # 消息體格式說明
Content-Length: 27               # 消息體字節長度(必需首部)
Accept: application/json         # 期望的響應格式
Authorization: Bearer abc123     # 認證令牌
Connection: keep-alive           # 連接控制#注意這里的空一行是標準
{"key": "value", "num": 42}      # 消息體(實際傳輸的數據)

第一行為請求行,包括方法、從服務器獲取資源路徑以及HTTP版本。
其他則是以 Key:Value組成的信息。
像User-Agent代表瀏覽器版本,host服務器名,Accept,告訴服務器,客戶端可以處理什么樣的數據(定義服務器返回格式)。
這些類型統稱為MIME類型,分為兩級:類型和子類型。例如:application/json

text/*
image/*
application/*
...等

當然也可以自定義非標準的定制類型和子類型,只要以x-開頭。例如flash文件,使用application/x-shockwave-flash類型。
最后以空行,或者空行+數據體

服務端響應如下

HTTP/1.1 200 OK                          # 狀態行(協議版本 + 狀態碼 + 原因短語)
Server: nginx/1.18.0                     # 服務器軟件及版本
Date: Fri, 13 Oct 2023 05:30:15 GMT      # 響應生成時間
Content-Type: text/html; charset=UTF-8   # 消息體的格式和編碼
Content-Length: 1234                     # 消息體的字節長度
Connection: keep-alive                   # 連接控制(保持活躍)
Cache-Control: max-age=3600              # 緩存策略(有效期1小時)
ETag: "abc123xyz"                        # 資源版本標識符
Last-Modified: Mon, 09 Oct 2023 12:00:00 GMT  # 資源最后修改時間<!DOCTYPE html>                          # 空行(分隔首部和消息體)
<html>                                   # 消息體(實際返回的內容)<head><title>Example Page</title></head><body><h1>Hello World</h1></body>
</html>

第一行表示服務器使用的協議HTTP1.1,緊跟一個響應碼。其他首部行則指出請求的日期、消息體字節長度等

2.Keep-Alive

在HTTP請求的首部中大家是否注意到Keep-Alive,他表示可以重用一個socket:
Connection:Keep-Alice。
在HTTP1.0會為每個請求打開一個新的連接,而這樣打開和關閉消耗的資源遠遠大于實際傳輸數據的開銷。所以在HTTP1.1以后就默認支持,復用socket連接,如果需要關閉則使用上述key-value顯示控制。

  • 在java中可以通過http.keepAlive控制true/false,來控制socket復用
  • http.maxConnections可以表示希望同時打開的socket的數量,來保證服務器不會被大量連接沖崩潰。

HTTP方法

HTTP服務器的遵循請求-響應模式:無狀態請求+無狀態響應。
HTTP的方法主要有4個:
POST、GET、PUT、DELETE
對于這些方法的使用,再談談幾點容易被忽略的細節:

  • GET方法獲取一個資源,它沒有副作用,如果失敗可以反復執行,而不用擔心有什么問題
  • GET輸出可能會被緩存,可以通過首部取消緩存進行禁用
  • PUT方法表示將資源上傳到服務器,但它具有冪等性。重復該方法也不用擔心是否失敗,兩次將同一個文檔放在同一個位置并不影響。
  • DELETE與PUT一樣具有冪等性,重復執行,也只會將資源刪除一次。
  • POST是最常用的方法,POST要用于不能重復的不安全的操作,如完成一個交易。

Cookie

很多網站使用一些小文本串在連接之間存儲持久的客戶端狀態,這些稱為cookie。
cookie在請求和響應的HTTP首部中,由服務器傳遞到客戶端,再從客戶端傳回服務器。
cookie可以是標識會話ID、購物車、登錄憑據等信息,也可以存無意義的值。
要在瀏覽器設置一個cookie,則需要服務器端在響應中使用Set-Cookie首部行:

HTTP/1.1 200 OK                          # 狀態行(協議版本 + 狀態碼 + 原因短語)
Content-Type: text/html; charset=UTF-8   # 消息體的格式和編碼
Set-Cookie: xxx=dsahjfkeqyowqlf   # 設置cookie

而后,客戶端再向同一個服務發送請求:

GET /index.html HTTP/1.1          # 請求行(方法 + URI + HTTP版本)
Host: www.example.com            # 目標主機(必需首部)
Cookie:cart = dsahjfkeqyowqlf   #cookie要與服務器給的一致

當然服務器可以設置不止一個cookie,可以有多個Set-Cookie,用于控制過期時間、路徑、端口、值等信息。

默認情況下,cookie來自哪個服務器則應用于哪個服務器。網站也可以指示一個cookie用于整個子域,例如從www.foo.example.com響應的:
Set-Cookie:user = elharo;Domain=.foo.example.com
表示瀏覽器除了可以用cookie返回最初的www.foo.example.com,還可發送給*.foo.example.com
當然還可以縮小它的使用域
例如:Set-Cookie: user=elharo; Path=/restricted,表示請求服務器上子樹/restricted,可以。而相同網站的其他目錄中就不能使用這個cookie。
在Set-Cookie中使用expires = Wdy, DD-Mon-YYYY HH:MM:SS GMT 可以設置cookie的過期時間。
設置Max-Age = 3600 ,則表示3600秒后過期,此時瀏覽器會從緩存中刪除這些cookie。


總結

本章節介紹了HTTP協議是現代Web通信的核心,其設計簡潔高效,支持多種請求方法和數據格式,并通過Cookie機制實現了客戶端狀態的持久化。隨著HTTP版本的演進,連接復用等優化機制進一步提升了通信性能。本文詳細介紹了HTTP協議的基本原理、請求響應格式、方法特性以及Cookie機制。

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

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

相關文章

用Deepseek寫一個五子棋微信小程序

在當今快節奏的生活中&#xff0c;休閑小游戲成為了許多人放松心情的好選擇。五子棋作為一款經典的策略游戲&#xff0c;不僅規則簡單&#xff0c;還能鍛煉思維。最近&#xff0c;我借助 DeepSeek 的幫助&#xff0c;開發了一款五子棋微信小程序。在這篇文章中&#xff0c;我將…

自然語言處理:最大期望值算法

介紹 大家好&#xff0c;博主又來給大家分享知識了&#xff0c;今天給大家分享的內容是自然語言處理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文簡稱為EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型參數的過程分成…

【從零開始學習計算機科學】計算機體系結構(一)計算機體系結構、指令、指令集(ISA)與量化評估

【從零開始學習計算機科學】計算機體系結構(一)計算機體系結構、指令、指令集(ISA)與量化評估 概論計算機體系結構簡介計算機的分類并行體系結構指令集體系結構(ISA)分類存儲器尋址尋址模式操作數大小指令ISA的編碼程序的優化計算機體系結構量化評估存儲器體系結構概論 …

Electron使用WebAssembly實現CRC-32 常用標準校驗

Electron使用WebAssembly實現CRC-32 常用標準校驗 將C/C語言代碼&#xff0c;經由WebAssembly編譯為庫函數&#xff0c;可以在JS語言環境進行調用。這里介紹在Electron工具環境使用WebAssembly調用CRC-32 常用標準格式校驗的方式。 CRC-32 常用標準校驗函數WebAssembly源文件…

Docker基礎篇——Ubuntu下Docker安裝

大家好我是木木&#xff0c;在當今快速發展的云計算與云原生時代&#xff0c;容器化技術蓬勃興起&#xff0c;Docker 作為實現容器化的主流工具之一&#xff0c;為開發者和運維人員帶來了極大的便捷 。下面我們一起進行Docker安裝。 Docker的官方Ubuntu安裝文檔&#xff0c;如…

第五課:Express框架與RESTful API設計:技術實踐與探索

在使用Node.js進行企業應用開發&#xff0c;常用的開發框架Express&#xff0c;其中的中間件、路由配置與參數解析、RESTful API核心技術尤為重要&#xff0c;本文將深入探討它們在應用開發中的具體使用方法&#xff0c;最后通過Postman來對開發的接口進行測試。 一、Express中…

mitmproxy配合Wireshark 抓包分析

Mitmproxy 是一款非常強大的 交互式 HTTP 代理 工具&#xff0c;它被廣泛應用于 Web 開發、API 調試、安全測試 等領域。與 Wireshark 側重于被動監聽網絡流量不同&#xff0c;Mitmproxy 更像一個 主動的中間人&#xff0c;可以攔截、檢查、修改和重放 HTTP/HTTPS 流量&#xf…

Varlens(手機上的單反)Ver.1.9.3 高級版.apk

Varlens 是一款專業級手機攝影軟件&#xff0c;旨在通過豐富的功能和高自由度參數調節&#xff0c;讓手機拍攝效果媲美微單相機。以下是核心功能總結&#xff1a; 一、核心功能 專業拍攝模式 支持手動/自動/程序模式&#xff0c;可調節ISO、快門速度、EV、白平衡等參數27 提供…

Scala 中的訪問修飾符

在Scala中&#xff0c;面向對象的權限控制主要通過訪問修飾符來實現。Scala提供了以下幾種訪問修飾符來控制類、對象、成員變量和方法的訪問權限&#xff1a; 1. 默認訪問權限&#xff08;無修飾符&#xff09; 如果沒有指定任何訪問修飾符&#xff0c;成員默認是public的&…

第十五屆藍橋杯省賽電子類單片機學習過程記錄(客觀題)

客觀試題: 01.典型的BUCK電源電路包含哪些關鍵器件(ABCD) A. 電容 B. 二極管 C. 電感 D. MOSFET 解析: 典型的 BUCK 電源電路是一種降壓型的直流-直流轉換電路,它包含以下關鍵器件: A.電容:電容在電路中起到濾波的作用。輸入電容用于平滑輸入電壓的波動,減少電源噪聲對…

Dify使用日常:我是如何按標題級別將word中的內容轉存到excel中的

先上效果圖 word中的內容 轉存到excel之后 實現步驟&#xff1a; 1、在dify中創建一個工作流&#xff0c;如上圖 2、在開始節點增加一個支持文件上傳的變量 3、添加文檔提取器&#xff0c;提取上傳的文件中的內容 4、添加大模型節點&#xff0c;將文檔提取器提取出來的內容&…

Vue 框架深度解析:源碼分析與實現原理詳解

文章目錄 一、Vue 核心架構設計1.1 整體架構流程圖1.2 模塊職責劃分 二、響應式系統源碼解析2.1 核心類關系圖2.2 核心源碼分析2.2.1 數據劫持實現2.2.2 依賴收集過程 三、虛擬DOM與Diff算法實現3.1 Diff算法流程圖3.2 核心Diff源碼 四、模板編譯全流程剖析4.1 編譯流程圖4.2 編…

IDEA與Maven使用-學習記錄(持續補充...)

1. 下載與安裝 以ideaIU-2021.3.1為例&#xff0c;安裝步驟&#xff1a; 以管理員身份啟動ideaIU-2021.3.1修改安裝路徑為&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾選【創建桌面快捷方式】&#xff08;可選&#xff09;、【打開文件夾作為項目】&…

認識vue2腳手架

1.認識腳手架結構 使用VSCode將vue項目打開&#xff1a; package.json&#xff1a;包的說明書&#xff08;包的名字&#xff0c;包的版本&#xff0c;依賴哪些庫&#xff09;。該文件里有webpack的短命令&#xff1a; serve&#xff08;啟動內置服務器&#xff09; build命令…

SQL經典查詢

查詢不在表里的數據&#xff0c;一張學生表&#xff0c;一張學生的選課表&#xff0c;要求查出沒有選課的學生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

《機器學習數學基礎》補充資料:過渡矩陣和坐標變換推導

盡管《機器學習數學基礎》這本書&#xff0c;耗費了比較長的時間和精力&#xff0c;怎奈學識有限&#xff0c;錯誤難免。因此&#xff0c;除了在專門的網頁&#xff08; 勘誤和修訂 &#xff09;中發布勘誤和修訂內容之外&#xff0c;對于重大錯誤&#xff0c;我還會以專題的形…

解鎖DeepSpeek-R1大模型微調:從訓練到部署,打造定制化AI會話系統

目錄 1. 前言 2.大模型微調概念簡述 2.1. 按學習范式分類 2.2. 按參數更新范圍分類 2.3. 大模型微調框架簡介 3. DeepSpeek R1大模型微調實戰 3.1.LLaMA-Factory基礎環境安裝 3.1大模型下載 3.2. 大模型訓練 3.3. 大模型部署 3.4. 微調大模型融合基于SpirngBootVue2…

第七課:Python反爬攻防戰:Headers/IP代理與驗證碼

在爬蟲開發過程中&#xff0c;反爬蟲機制成為了我們必須面對的挑戰。本文將深入探討Python爬蟲中常見的反爬機制&#xff0c;并詳細解析如何通過隨機User-Agent生成、代理IP池搭建以及驗證碼識別來應對這些反爬策略。文章將包含完整的示例代碼&#xff0c;幫助讀者更好地理解和…

Vue3——Fragment

文章目錄 一、Fragment的核心意義1. 解決Vue2的單根限制問題2. 減少不必要的 DOM 嵌套3. 語義化和結構化 二、Fragment 的實現原理三、Fragment 使用方式1. 基本用法2. 結合條件渲染3. 動態組件 四、實際應用場景1. 列表/表格組件2. 布局組件3. 語義化標簽 五、注意事項1. 屬性…

字節跳動C++客戶端開發實習生內推-抖音基礎技術

智能手機愛好者和使用者&#xff0c;追求良好的用戶體驗&#xff1b; 具有良好的編程習慣&#xff0c;代碼結構清晰&#xff0c;命名規范&#xff1b; 熟練掌握數據結構與算法、計算機網絡、操作系統、編譯原理等課程&#xff1b; 熟練掌握C/C/OC/Swift一種或多種語言&#xff…