談談 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 狀態碼的大致介紹。

Facebook Threads X

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!