如何選擇正確的HTTP狀態碼?

2021-03-02 InfoQ
眾所周知,每一個HTTP響應都會帶有一個狀態碼,不過對於很多開發者來說,平時使用最多的幾個狀態碼無外乎就是200、400、404、500等。那其他眾多狀態碼該應用在何種場景中,什麼時候應該使用哪些狀態碼就成為一個值得我們深入思考的問題了。即便在Facebook這樣的公司中,那些聰明的開發者所構建的API也可能只返回200。

為此,Michael Kropat專門撰文分析了各個狀態碼的適用場景,以及我們為何要如此細緻地區分不同狀態碼,同時還談及了這麼做的好處。

有什麼是比返回一個HTTP狀態碼還要簡單的事情呢?頁面渲染了麼?如果渲染,那就返回200唄。頁面不存在?那就是404。需要將用戶重定向到另外一個頁面?那就使用302,也許301也行。

一切都是如此簡單,不過當有人跟你說,你並沒有以REST的方式做事情,你可能就要警醒了。新資源是否返回了RFC兼容、Roy-Fielding建議的狀態碼?只會是200麼?也許是204 No Content、202 Accepted,抑或是201 Created?

問題在於官方HTTP/1.1指南(RFC)最初是在1997年發布的。那時的我們還在使用Netscape Navigator、33.6kbps的調試解調器網上衝浪呢。這就好比是在現代商業戰略中使用孫子兵法一樣。這些寶貴的建議並不會隨著時間的流逝而發生變化。不過,我們需要真正理解他們。

如果有可視化的決策樹就好了,它可以幫助你快速識別與你的情況相吻合的狀態碼,這樣就能忽略掉那些不相關的了。請看下圖。

上圖看起來是顯而易見的,不過我發現很多人都會陷入其中,並且提出諸如「這種情況應該使用503 Service Unavailable還是404 Not Found呢」?停。如果你在完全不同的響應類別中思考具體的狀態碼,那就表明你的做法是完全錯誤的。再來看看上面這張圖。

在繼續之前我提出幾點:

最後再提一點:我其實並沒有什麼資格就這個主題發表自己的看法,我只不過閱讀過一些RFC並開發過一些APIs而已。如果覺得我說的不對,或是沒有使用你傾向於使用的狀態碼,那麼請在文末的評論中指出來,大家一起討論。

2XX/3XX


4XX


5XX


雖說Facebook中很多聰明的開發者在構建APIs時只返回200,但我想說的是,狀態碼確實是非常重要的。現有的狀態碼對於現代網站/API來說有些太寬泛了。如果響應要以應用特定的格式來包含一些細節信息,比如說哪些欄位驗證失敗了,原因是什麼,這樣可以讓客戶端以更加有意義的方式來處理響應。既然如此,那為何不多花點時間來研究一下那些「不太常用」的HTTP狀態碼呢?

在談及為何說使用具體的狀態碼是非常重要的時候,人們很愛提到的一個原因就是HTTP是個分層系統,客戶端與伺服器之間可能存在著代理、緩存或是其他HTTP庫,如果響應碼有意義,那會讓這一切都工作地更好。不過,我覺得這個解釋站不住腳,比如說未來大家都使用上了HTTPS,我們也禁用掉了所有代理與緩存結點,你能說這時狀態碼就沒用了麼?

這裡,我想談談我認為狀態碼依然很重要的3點原因:

1. 客戶端可以針對不同的狀態碼採取不同的行為(或是可以輕鬆擴展以應對):

301 Moved Permanently與302 Found對於Google與其他搜尋引擎來說還有SEO的隱喻

301 Moved Permanently有緩存的含義,而429 Too Many Requests則沒有緩存的含義,諸如此類

客戶端庫可以通過一段時間的延遲後重試請求來處理429 Too Many Requests

客戶端庫可以採取類似的方式處理503 Service Unavilable

2. 很多狀態碼所表示的情況可以通過特殊的響應進行處理。

3. 不管信不信,目前很多流行的APIs建立了一些約定,比如說返回201 Created、429 Too Many Requests,或是503 Service Unavilable。如果遵循這些約定,那麼用戶在使用你的網站/API時就會更輕鬆,遇到問題時也更容易解決。

相關焦點

  • HTTP狀態碼404是啥意思?
    實例:如圖3-9所示,一些流媒體技術,比如在線視頻可以邊看邊下載,就是使用206 狀態碼來實現的。▲圖3. 9 狀態碼206啟動 Fiddler, 然後用瀏覽器打開「搜狐視頻中的綠箭俠」http: //tv.sohu.com/20121011/n354681393.shtml, 然後你在Fiddler中就能看到一堆的206。
  • 用貓咪圖片來記憶 HTTP 狀態碼
    記憶HTTP狀態碼是有一些困難的,因為狀態碼很多且很難記憶。GirlieMac,也就是Tomomi Imura利用她巧妙的構思,PS了一系列的HTTP狀態信息。在你看過這些圖片之後,你絕對可以記住一些 HTTP 狀態碼,因為我就只是在這裡才學會了這些狀態碼。PS:你可以在Flickr 看到全部到圖片。
  • 404 NotFound,原來http響應狀態碼都是這個意思!
    無論是滲透測試員還是網站運營人員,都會接觸到http的響應碼的問題。每條HTTP響應消息都必須在第一行中包含一個狀態碼,說明請求的結果。根據代碼的第一位數字,可將狀態碼分為以下5類:當然,還有一些不常見的狀態碼,但比較特殊情況下才會出現,暫不討論。
  • LoadRunner: 腳本回放時的錯誤「HTTP 狀態碼401未授權「
    原文:http://blog.csdn.net/feishin/article/details/53816649翻譯(轉載請標註smooth
  • 那些代表性的HTTP狀態碼,你還只知道404嗎?快來看看吧
    不過你以為HTTP請求的狀態碼就只有這麼幾個麼?其實是遠遠比這個多的。今天這篇文章我們就一起來看看HTTP請求中常用的狀態碼吧。HTTP狀態碼2XX-請求成功以2開頭的2XX類的狀態碼,都表示請求成功,伺服器正確執行了請求的操作。例如POST請求,在請求體中發送的數據會被伺服器端正確的處理,例如寫資料庫操作。
  • 看視頻 如何正確選擇及佩戴口罩
    看視頻 如何正確選擇及佩戴口罩 2020-01-28 00:12 來源:澎湃新聞·澎湃號·政務
  • 除了404 HTTP網頁狀態碼還有啥?-網頁,代碼,404, ——快科技(驅動...
    今天我們就來談一談那些狀態碼。但似乎一般人都不會仔細研究這些HTTP狀態碼和這些狀態碼對開發人員的影響。也許,一個開發人員就算不知道這些狀態碼也能開發出一個網站,但如果企業要開發一個大型網站,在某些時候需要微調或系統整合需要到更底層的網絡工作時,就有可能遇到瓶頸,特別是在出錯時更加明顯。對於狀態碼的分類有三個層級,就好像404那樣用3三個數字表示,分為大類,中類和小類。
  • 科普:404/401/408...這些HTTP網頁狀態碼代表啥含義? - IT之家
    今天我們就來談一談那些狀態碼。404和HTTP狀態碼上面所說的404其實是一種標準的HTTP返回代碼,官方名稱是HTTP狀態碼(HTTPStatusCode),用於表示網頁伺服器HTTP的響應狀態。但似乎一般人都不會仔細研究這些HTTP狀態碼和這些狀態碼對開發人員的影響。
  • Jmeter之HTTP請求與響應
    HTTP請求詳解一個http請求指從客戶端到服務端的請求信息,我們可以通過瀏覽器的F12鍵,可以看到以下信息:1.請求地址:uri響應指的是從伺服器到客戶端的響應信息,它包括了以下信息:1.響應狀態碼:標記響應狀態,用來體現一個請求是否成功,例如200-成功,404:資源找不到,500-伺服器異常,302-重定向等等2.響應頭:告訴客戶端關於伺服器
  • 都說HTTP協議是無狀態的,這裡的「狀態」到底指什麼?
    協議,發現對介紹http的第一句話【http協議是無狀態的,無連接的】很有意思:這裡的無狀態的【狀態】到底指的是什麼?!【伺服器中沒有保存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求伺服器 】這裡的客戶端的狀態是不是確切地指伺服器沒有保存客戶的信息呢?但顯然不是啊。2.【HTTP無狀態的特性嚴重阻礙了這些應用程式的實現,畢竟交互是需要承前啟後的,簡單的購物車程序也要知道用戶到底在之前選擇了什麼商品】我對此質疑為什麼無狀態就不能實現購物車呢?
  • Asics跑鞋的選擇 跑步正確的落腳方式 跑步正確的場地選擇
    二、跑步穿什麼鞋才正確鞋子種類很多,就跑步而言,一般分為慢跑鞋、競速鞋、越野跑鞋等,這些跑鞋都有很多款式和選擇。三、跑步正確的呼吸方式長距離跑應該使用口鼻一起呼吸,呼吸時嘴巴不要張得過大,避免造成呼吸道乾澀,建議微微張開既可。記住呼吸和步頻一樣都需要節奏,最好是相協調,例如三步一呼,三步一吸。
  • HTTP協議無狀態中的 "狀態" 到底指的是什麼?
    引子最近在好好了解http,發現對介紹http的第一句話【http協議是無狀態的,無連接的】就無法理解了:無狀態的【狀態】到底指的是什麼?!【伺服器中沒有保存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求伺服器 】這裡的客戶端的狀態是不是確切地指伺服器沒有保存客戶的信息呢?但顯然不是啊2.【HTTP無狀態的特性嚴重阻礙了這些應用程式的實現,畢竟交互是需要承前啟後的,簡單的購物車程序也要知道用戶到底在之前選擇了什麼商品】我對此質疑為什麼無狀態就不能實現購物車呢?
  • 如何正確選擇老年人的護膝裝置
    如何正確選擇老年人的護膝裝置?隨著年齡的增長,身體上的退化,老年人易出現的就是腰腿疼,而使用護膝可有效保暖膝關節,減弱老寒腿等疾病的痛苦,所以,正確選擇老年人的護膝成了一個重要的話題,那麼究竟如何正確選擇老年人的護膝裝置?下面尋醫問藥網詳細為大家解讀。
  • 【綜合推薦】265期福彩3D綜合推薦:上期五碼正確,殺一碼5正確
    264期福彩3D開獎號【933】五碼【23469】正確,殺一碼【
  • 【天業專欄】初選六碼複式正確,試機後5碼複式03568正確,單挑065開865
    6碼正確!初選六碼複式正確,試機後5碼複式03568正確,單挑065開865。本期看點初定和尾26,重點組六,本期防組三回補。膽碼關注12路上膽,首選巨毒88888888。回復毒膽8(百位)正確,雙飛78正確,5碼複式中出877第014期:初定雙飛07正確第015期:初定巨毒9正確,跨度4正確,複式6碼正確。
  • 【司令專欄】上期福彩五碼01567正確
    第271期:複式六七碼正確第272期:毒2正確,殺0正確第273期:殺6正確第274期:複式五六七碼正確第275期:毒膽6正確,複式五六七碼正確,精選716中直選第276期:複式六七碼正確第277期:毒5正確第278期:複式七碼正確第280期:跨度6正確第281
  • 【穩】『火龍果算膽』上期初選3D獨膽7 雙膽07* 兩碼07 五碼正確;P3膽碼**9正確;試後P3獨膽5正確 3D獨膽7正確;
    自創一套選擇金銀銅膽的方法。長期統計較為穩定,通過留言論壇挖掘,正式入駐開設專欄。進行公開推薦,助力大家上岸。。200227期 獨膽1** 複式六碼正確 開188228期 獨膽4 三膽04 兩碼34 複式五碼正確 試後單挑034成功 開430230期 獨膽5 開573232期 三膽對0 複式五碼正確  開056233期 獨膽9 三膽39 跨度6 複式五碼 定位複式正確 開393235期 三膽2正確 開284237
  • 黃銅止回閥該如何選擇正確型號?
    之所以現在黃銅指揮閥應用得到全面推廣,就是因為功能性很強,質量很穩定,那麼如何選擇正確型號發揮重要優勢呢?1、根據管道尺寸選擇為了選擇正確的型號,建議大家根據管道的尺寸來選擇設備,管道的尺寸直接決定了黃銅止回閥的型號,所以在選擇時要了解這些客觀問題,才能針對性判斷到底哪些型號適合使用需求。
  • 開發人員最常使用的HTTP狀態代碼的參考指南
    狀態代碼由RFC 2616的第10節指導。大多數情況下,用戶看不到瀏覽器返回的代碼,但是每次瀏覽器與伺服器交互時都會返回它們。狀態代碼可以在顯示正確的錯誤消息和成功消息方面幫助使用應用程式為觀眾提供更好的用戶體驗。共有五個標準組。狀態代碼分為幾部分,它們可以由代碼的第一位標識。
  • 【穩】『火龍果算膽』上期3D獨膽*0* 複式七碼正確;P3三膽9正確;試後P3獨膽3 兩碼23正確;超穩定膽碼PK全網!!!
    自創一套選擇金銀銅膽的方法。長期統計較為穩定,通過留言論壇挖掘,正式入駐開設專欄。進行公開推薦,助力大家上岸。。200227期 獨膽1** 複式六碼正確 開188228期 獨膽4 三膽04 兩碼34 複式五碼正確 試後單挑034成功 開430230期 獨膽5 開573232期 三膽對0 複式五碼正確  開056233期 獨膽9 三膽39 跨度6 複式五碼 定位複式正確 開393235期 三膽2正確 開284237