談談 HTTP 狀態碼 206 Partial Content
相信大多數人應該都比較熟悉 HTTP status code 200, 201 吧?
本文來聊聊比較少接觸的 HTTP status code 206 吧!
現代瀏覽器支援在 HTTP headers 中加上 Range 對後端伺服器索取部分內容,這功能稱為 partial requests, 一旦後端瀏覽器支援回應部分內容的功能,它就會回應 HTTP status code 206, 並且附上部分的內容。
這種可以索取部分內容,並請只回應部分的情況,就相當適合做串流服務(或者續傳功能),使用者不需要等全部資料都下載之後才能觀看,只要下載好部分內容就可以開始觀看。
p.s. 串流服務的做法有很多種,本文所提的只是其中 1 種方式
整個運作大致長這樣,首先發出 HTTP request, 必須含有 Range Header, 例如:
GET /movie.mp4 HTTP/1.1
Host: example.com
Range: bytes=0-499
上述標頭的意思是要求資源前 500 bytes 作為回應, bytes=
代表以 byte 為單位,而 0-499
代表從最開始的 byte 到第 500 個 byte 。
由於前端在發出 request 時還無法知道資源(resource)的切確長度,所以還可以忽略 -
之後的值,變成 Range: bytes=0-
, 這情況下,後端伺服器會以資源長度作為結束值,假設資源長度 1000
, 那它就會回應 0-999
。
後端伺服器收到 Range Header 之後,如果有支援回應部分內容,就會回應 2 個 Headers 在 HTTP response 之中:
HTTP/1.1 206 Partial Content
Content-Length: 500
Content-Range: bytes 0-499/1000
(binary)
Content-Length
代表此次回應長度 500 bytes, 而 Content-Range
則代表回應單位 byte, 範圍為 0-499
, /1000
則代表資源總長度 1000
bytes 。
如果你發出的 request Range 範圍有誤,後端伺服器就會回應 416 Range Not Satisfiable, 這時就需要修正你所送出的範圍。
另外, Range Header 也支援 suffix 的用法,也就是取得最後幾個單位的長度,例如下列代表取得最後 1 個 bytes :
Range: bytes=-1
這種用法相當適合用來探詢資源大小。
噢對, Range Header 也支援多個範圍的使用方式,例如:
Range: bytes=0-499, 500-
如果想實際玩看看的話,可以用 curl
指令試試。
查詢是否支援 partial requests 的指令:
$ curl -I <網址>
如果回應不是以下文字的話,就代表有支援:
Accept-Ranges: none
取得部分內容的指令:
curl <網址> -i -H "Range: bytes=0-50, 100-150"
p.s. www.example.com
有支援 partial requests, 可以玩看看
以上就是關於 206 狀態碼的大致介紹。