? ? ? ? 本文著重針對http在傳輸數據時的幾種封裝方式進行描述。
? ? ? ? 1.?Content-Type(描述body內容類型以及字符編碼)
????????HTTP的Content-Type用于定義數據傳輸的媒體類型(MIME類型),主要分為以下幾類:
????????(一)、?基礎文本類型?
????????????????text/plain?
????????????????純文本格式,無任何格式標記,常用于日志或簡單文本傳輸。示例:
????????????????Content-Type: text/plain; charset=utf-8
? ? ? ? ? ? ? ? text/html?
????????????????HTML文檔格式,用于網頁渲染。示例:
????????????????Content-Type: text/html; charset=utf-8
? ? ? ? ? ? ? ??text/xml?
????????????????XML數據格式,適用于結構化文本傳輸。示例:????????????????Content-Type: text/xml; charset=utf-8
? ? ? ? (二)、?表單數據類型?
????????????????application/x-www-form-urlencoded?
????????????????表單默認編碼格式,數據以key=value形式拼接(如name=John&age=30)。適用于普通表單提交。示例:
????????????????Content-Type: application/x-www-form-urlencoded
? ? ? ? ? ? ? ??multipart/form-data?
????????????????支持文件上傳的編碼格式,數據按字段分割并通過boundary標識。示例:
????????????????Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
? ? ? ? (三)、?結構化數據格式?
????????????????application/json?
????????????????JSON數據格式,廣泛用于API交互。示例:? ??????????????Content-Type: application/json; charset=utf-8
? ? ? ? ? ? ? ??application/xml?
????????????????XML數據格式,適用于復雜結構化數據傳輸。示例:????????????????Content-Type: application/xml
? ? ? ? ? ? ? ??application/javascript?
????????????????JavaScript代碼傳輸,常用于動態腳本加載。示例:????????????????Content-Type: application/javascript
????????(四)、?二進制文件類型?
????????????????application/octet-stream?
????????????????通用二進制流格式,適用于未知類型的文件下載。示例:????????????????Content-Type: application/octet-stream
? ? ? ? ? ? ? ??image/*(如image/jpeg、image/png)?
????????????????圖片文件格式,*表示具體圖片類型(如JPEG、PNG)。示例:????????????????Content-Type: image/jpeg
? ? ? ? ? ? ? ??application/pdf?
????????????????PDF文檔格式,用于文檔傳輸。示例:????????????????Content-Type: application/pdf
????????(五)、?其他常見類型?
????????????????application/zip?
????????????????壓縮文件格式,適用于打包文件傳輸。示例:????????????????Content-Type: application/zip
? ? ? ? ? ? ? ??audio/*(如audio/mpeg)?
????????????????音頻文件格式,如MP3、WAV等。示例:????????????????Content-Type: audio/mpeg
? ? ? ? ? ? ? ??video/*(如video/mp4)?
????????????????視頻文件格式,如MP4、AVI等。示例:????????????????Content-Type: video/mp4
????????(六)、?MIME類型結構?
????????????????MIME類型由主類型(media type)和子類型(subtype)組成,格式為:
????????????????Content-Type: <主類型>/<子類型>; 參數(如charset、boundary等)
????????????????例如:text/html; charset=utf-8?。
????????關鍵使用場景
????????????????API交互?:優先使用application/json?。
????????????????文件上傳?:必須使用multipart/form-data?。
????????????????網頁渲染?:需指定text/html?。
????????????????純文本傳輸?:采用text/plain?。
? ?2.Content-Encoding(描述整個body內容的編碼)
? ? ? ? ? ? ? ? 請求方向服務端描述能夠接收的編碼算法
????????????????Accept-Encoding: gzip, deflate, br
? ? ? ? ????????服務端向請求端描述實際使用的編碼算法? ? ? ??
????????????????Content-Encoding: gzip
????????當采用具體的壓縮算法后,服務器端會對整體需要返回的數據進行對應算法的壓縮,在Content-Length中描述的長度,將是壓縮后數據的長度。
? ? ? ? 客戶端收取到數據后,需要使用對應算法進行解壓縮,得到真實的數據。
? ?3.Transfer-Encoding(數據傳輸發送和壓縮算法)
????????Transfer-Encoding 是 HTTP 協議中用于指定傳輸編碼方式的響應頭字段,其枚舉值包括以下幾種:
????????chunked?
????????表示數據以分塊形式傳輸,適用于無法預先確定響應體長度的場景(如動態生成內容或大文件傳輸)?。
????????ompress?
????????使用 Lempel-Ziv-Welch (LZW) 算法進行壓縮傳輸,但目前主流瀏覽器已不再支持該格式?。
????????deflate?
????????使用 zlib 結構和 deflate 壓縮算法進行傳輸,適用于需要壓縮的場景?。
????????gzip?
????????使用 Lempel-Ziv coding (LZ77) 算法進行壓縮傳輸,廣泛用于文本內容的壓縮(如 HTML、CSS、JS 等)?。
????????identity?
????????表示不進行任何編碼或壓縮,直接傳輸原始數據?。
????????多值組合?
????????可以同時指定多個值,用逗號分隔。例如:Transfer-Encoding: gzip, chunked,表示先進行 gzip 壓縮,再以分塊形式傳輸?。
? ? ? ? 備注:在chunked和壓縮算法多值組合時,這里的壓縮算法是單個chunked內的壓縮,不是對整體body的壓縮。
? ? ? ? 如果一個http響應頭如下:Content-Encoding:deflate Transfer-Encoding:gzip,chunked,那么客戶端在收取到每個chunked數據時,先用gzip進行解壓縮,收取完所有的chunked后,把解壓縮的數據拼到一起,再使用deflate進行解壓縮,才能得到服務器最終要發送的數據。
? ? ? ? 對chunked的描述
????????chunked 是 HTTP/1.1 中用于分塊傳輸數據的編碼方式,適用于動態生成內容或大文件傳輸的場景。以下是 chunked 格式的詳細描述:
????????(一)、基本格式?
????????????????每個 chunk 的結構?
????????????????????????每個 chunk 由以下部分組成:
????????????????????????塊大小?:以十六進制表示,后跟 \r\n。
????????????????????????數據內容?:實際數據,后跟 \r\n。
????????????????示例:
????????????????????????5\r\n ? ? ? ?// 塊大小為5字節
????????????????????????Hello\r\n ? ?// 數據內容
????????????????結束標記?
????????????????????????最后一個 chunk 的塊大小為 0,表示傳輸結束。
????????????????示例:
????????????????????????0\r\n\r\n ? ?// 結束標記
? ? ? ? (二)、完整示例?
????????以下是一個完整的 chunked 傳輸示例:
????????????????HTTP/1.1 200 OK ?
????????????????Content-Type: text/plain ?
????????????????Transfer-Encoding: chunked ?
????????????????5\r\n ?
????????????????Hello\r\n ?
????????????????6\r\n ?
?????????????????World\r\n ?
????????????????0\r\n\r\n ?
????????解析:
????????????????第一個 chunk:5\r\nHello\r\n,表示傳輸了 5 字節的數據 Hello。
????????????????第二個 chunk:6\r\n World\r\n,表示傳輸了 6 字節的數據 World。
????????????????結束標記:0\r\n\r\n,表示傳輸結束。