【HTTP】HTTP header頭

目錄

Http請求響應

​​那些年用錯HTTP header的異象

1.Content-length

2.Content-Type

3.Accept-Encoding&Content-Encoding

4.Connection


HTTP header概覽 

本文主要關注報文首部字段(header field ),HTTP首部字段是由首部字段名和字段值構成的,中間用冒號“:”分隔,樣例如下

Content-Type: application/xml
Connection: Keep-alive

首部字段(header field )按照使用方的維度可以分爲以下4類,具體某個header詳情參考文檔 和rfc2616

首部字段分類 含義 常用首部
通用 General 請求和響應雙方都使用

Cache-ControlConnection、Date、Pragma、Trailer、Transfer-Encoding、Upgrade、Via、Warning

通用實體Entity 請求和響應的實體body部分使用

Allow

Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type

Expires、Last-Modified

請求 Request 客戶端發送請求時使用

Accept、Accept-Charset、Accept-Encoding、Accept-Language

Authorization、Expect、From、Host

If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since

Max-Forwards、Proxy-Authorization、Range、Referer、TE、User-Agent

響應 Response 服務端返回響應時使用

Accept-Ranges、Age、ETag、Location、Proxy-Authenticate、Retry-After、

Server、Vary、WWW-Authenticate

還有Cookie、Set-Cookie和Content-Disposition等在其他RFC中定義的首部字段,它們的使用頻率也很高。

按照功能分類,藍色表請求頭,紫色表示響應頭,紅色表示通用頭

分類 headers 應用
緩存控制
  • Last-Modified If-Modified-Since
  • ETag If-None-Match
  • Expires
  • Cache-Control
緩存控制參考
內容協商

Accept、Accept-Charset、Accept-Encoding、Accept-Language

Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type

某一資源,服務端有多個版本,

客戶端告知服務器自己的偏好Accept,

服務器據偏好選擇對應版本響應客戶端的請求

連接管理

Connection

Keep-Alive

Keep-Alive複用tcp連接

close 每次重新建立連接

代理路徑

 

Via

Max-Forwards

Via: 1.1 ID-5301755340307730 uproxy-6

(http協議版本,代理服務器信息)

Max-Forwards每經過跳-1, 0時代理服務器不能再轉發該請求了

條件請求

If-Match、If-None-Match、Etag

If-Modified-Since、If-Unmodified-Since

If-Range

If-Match的值跟服務端ETag值匹配一致時,

服務端纔會接受請求

If-Modified-Since 客戶端緩存更新,如果在If-Modified-Since字段指定的日期時間後,資源發生了更新,服務器會接受請求

那些年用錯HTTP header的異象

1.Content-length

字段Content-Length表明了實體主體部分的大小(單位是字節)。對實體主體進行內容編碼傳輸時,不能再使用Content-Length首部字段。

項目中使用了Content-length字段,傳輸了報文體的字節長度,當時對端收到的報文少了一些字符。因爲Content-length小於實際報文長度,導致發生截斷

解決方案,去掉該頭即可。具體請戳

2.Content-Type

當傳輸有交換格式的報文,如xml等不帶header(Content-Type:application/xml;charset=utf-8)的話,一般的http client實現發送時底層會對報文進行URLencode,對端收到的就是對特殊字符編碼後的樣子。

 client傳輸的報文 Server收到的報文
<?xml version="1.0" encoding="UTF-8"?> %3c%3fxml+version%3d%221.0%22+encoding%3d%22UTF-8%22%3f%3e

3.Accept-Encoding&Content-Encoding

客戶端頭部Accept-Encoding字段值爲空,則只有“ identity”編碼是可以接受的。

當客戶端傳輸Accept-Encoding: gzip時,服務端會傳輸gzip壓縮後的響應,但是客戶端如果不支持gzip解碼的話,還按照簡單的字節流處理方式,會報異常報文

4.Connection

管理持久連接,http/1.1不傳默認好似Keep-Alive。

通用頭部header 含義
Connection: close

當服務器端想明確斷開連接時,則指定Connection首部字段的值爲Close

HTTP/1.1之前的HTTP版本的默認

Connection:Keep-Alive 

在舊版本的HTTP協議上維持持續連接

HTTP/1.1版本的默認連接都是持久連接

HTTP/1.1版本的默認連接都是持久連接。爲此,客戶端會在持久連接上連續發送請求。當服務器端想明確斷開連接時,則指定Connection首部字段的值爲Close。

沒有配置這個字段,默認是Keep-Alive,客戶端會複用這個tcp連接,如果服務端斷開了連接,就會報通信異常,對端已經關閉了連接。

可以通過傳輸Connection: close 主動關閉連接(不再複用),避免後續請求的通信異常。

發佈了97 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章