Accept Encoding和Content Encoding Accept Encoding和Content Encoding是HTTP中用來對採用何種壓縮格式傳輸正文進行協定的一對header。工作原理如下: 瀏覽器發送請求,通過Accept Encoding帶上自己支持的內容編碼格式列表 服 ...
Accept-Encoding和Content-Encoding
Accept-Encoding和Content-Encoding是HTTP中用來對採用何種壓縮格式傳輸正文進行協定的一對header。工作原理如下:
- 瀏覽器發送請求,通過Accept-Encoding帶上自己支持的內容編碼格式列表
- 服務端從中挑選一個用來對正文進行編碼,並通過Content-Encoding響應頭指明響應編碼格式。
- 瀏覽器拿到響應正文後,根據Content-Encoding進行解壓縮。服務端若響應未壓縮的正文,則不允許返回Content-Encoding。
壓縮類型:
- gzip:表示採用 Lempel-Ziv coding (LZ77) 壓縮演算法,以及32位CRC校驗的編碼方式
- Compress:採用Lempel-Ziv-Welch (LZW) 壓縮演算法。
- deflate:表示採用 zlib 結構 (在 RFC 1950 中規定),和 deflate 壓縮演算法(在 RFC 1951 中規定)。
- identity:用於指代自身(未經過壓縮和修改)。除非特別指明,這個標記始終可以被接受。
- Br:表示採用Brotli 演算法的編碼方式。
內容編碼:
- 內容編碼針對的只是傳輸正文。HTTP/1中,header始終是以ASCII文本傳輸,沒有經過任何壓縮;HTTP/2中引入header壓縮技術。
傳輸編碼Transfer-Encoding
- 用於表示節點之間傳輸message的編碼方式。最典型是分塊傳輸(chunked)
- 是一個響應header
Transfer-Encoding支持類型:
- chunked
- compress
- deflate
- gzip
- identit
- 多個類型可以共存
Gzip+Curl例子:
echo "content=Web%20%E5%AE%89%E5%85%A8%E6%98%AF%E4%B8%80%E9%A1%B9%E7%B3%BB%E7%BB%9F%E5%B7%A5%E7%A8%8B%EF%BC%8C%E4%BB%BB%E4%BD%95%E7%BB%86%E5%BE%AE%E7%96%8F%E5%BF%BD%E9%83%BD%E5%8F%AF%E8%83%BD%E5%AF%BC%E8%87%B4%E6%95%B4%E4%B8%AA%E5%AE%89%E5%85%A8%E5%A0%A1%E5%9E%92%E5%9C%9F%E5%B4%A9%E7%93%A6%E8%A7%A3%E3%80%82" | gzip -c > data.txt.gz
curl -v --data-binary @data.txt.gz -H'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H'Content-Encoding: gzip' -X POST https://qgy18.com/node/
Transfer-Encoding與Content-Encoding的區別:
- Transfer-Encoding只是在傳輸過程中才有的,併發請求URL對應實體的本身特性。
- Transfer-Encoding是一個"跳到跳"的header,而Content-Encoding是"端到端"的header。
Content-type
Content-type是HTTP的實體首部,用於說明請求或者返回的消息主體是用何種方式編碼(即資源的MIME類型)。在請求、響應header中均存在。
示例如下:
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
參數一般包含:
- media-type:資源或者數據的MIME type
- charset:字元編碼標準
- boundary:多於多部實體,boundary是必需的。其包括一組1到70個字元,用於封裝消息的多個部分的邊界。
Media-type常用類型:
application/x-www-form-urlencoded
- form表單或者提交的數據按照key1=value1&key2=value2方式進行編碼,key、value均進行了urlencode
multipart/form-data
- 常見的POST數據提交的方式,使用form進行文件上傳的時候,必須讓form的enctype為這個。
application/json
- 消息主體是序列化後的json字元串。
text/html
- 是一種用HTTP作為傳輸協議,XML作為編碼方式的遠程調用規範。