本文轉載自:衆成翻譯 譯者:十年蹤影 連接:http://www.zcfy.cc/article/904 原文:http://racksburg.com/choosing-an-http-status-code/html
有什麼能比 HTTP 響應狀態碼更簡單呢?頁面渲染了嗎?好極了,返回 200
。頁面不存在?那麼是 404
。想要跳轉到另外一個頁面?302
或者多是 301
。git
我喜歡把 HTTP 狀態碼想象成無線電波傳輸的 10 碼<sup>1</sup>。「呼叫,呼叫,我是 White Chocolate Thunder,發現 200 OK。」github
—— Aaron Patterson (@tenderlove) 2015-10-7web
<!–more–>api
生活是美好的……直到有人告訴你,你尚未作這個 REST<sup>2</sup>。而後你該失眠了,由於你需瞭解是否你的新資源返回符合 RFC 規範<sup>3</sup>,Roy-Fielding 規定的狀態碼。這裏只有 200
嗎?或者爲何沒有 204 No Content
?或許有 202 Accepted
……或者有 201 Created
?瀏覽器
使事情複雜化的是,官方的 HTTP/1.1 指南 —— RFC —— 是寫於 1997 年的。† 在那一年,人們還在使用 Netscape 瀏覽器以 33.6 KB 的調制解調器來上網。在如今用 HTTP/1.1 就有點像把孫子兵法運用於現代企業戰略,兵法無疑是偉大的,但我根本不知道如何具體運用。緩存
能不能有一種直觀的決策樹來讓你快速肯定你要用到的少數狀態碼,並將那些不相關的和廢棄的狀態碼排除掉?服務器
固然能夠,如今就能給你一個。框架
它可能看起來很好笑,可是我曾經看到過太多人分不清這些,「這裏應該用 503 Service Unavaliable
仍是 404 Not Found
?」若是你曾經在這上面猶豫,那麼你徹底弄混了不一樣的響應類型,你的作法徹底是錯的。你應該回頭看看上面這張流程圖。svg
在深刻到具體規範的流程圖以前,有一些注意事項:
最後但一樣重要的,免責聲明:我不保證我寫的徹底正確,我只是讀了一些 RFC 文檔在 Racksurg 公司實際工做時,天天用它來實現有用的 API。若是你認爲我是錯的或者我輕視了你最喜歡的狀態碼,那多是個人失誤,你能夠經過評論告知我究竟錯在哪裏。
我並不徹底肯定它們真的重要。
Facebook 上有許多聰明人,他們建立了 API 只返回 200
。
反對挑選指定狀態碼的基本觀點是:現有的狀態碼對於現代網站/API來講太通用了。它沒法讓客戶端以任何一種有意義的方式處理包含特定應用格式的細節的返回信息 —— 例如表單的哪個字段校驗失敗了以及爲何失敗了。既然如此,那麼爲何要在多餘的沒什麼用的 HTTP 狀態碼上浪費時間?
若是要給出一個理由,來講明爲何使用特定的狀態碼很重要,公認的理由是 HTTP 是一個分層的系統,若是響應狀態碼是有特定含義的,任何代理、緩存或者位於客戶端和服務器之間的 HTTP 框架可以更好地工做。我不認爲這個理由足夠更使人信服,尤爲如今每一個人都開始將服務遷移到 HTTPS,咱們禁止了任何不被服務器直接控制的代理或緩存節點。
然而,我會給你三個理由爲何我認爲狀態碼仍然很重要:
客戶端已經處理(或者能夠方便地被擴展以便處理)具備特定行爲的不一樣狀態碼:
302 Found
,301 Moved Permanently
在 Google 等搜索引擎上有更好的 SEO 效果。301 Moved Permanently
可以被緩存,而 429 Too Many Requests
不被緩存等等。 有的客戶端庫能夠處理 429 Too Many Request
,將請求回退並一天以後再次嘗試請求。 有的客戶端能夠用一樣的方式處理 503 Service Unavilable
。即便對現代需求不能徹底知足,許多狀態碼依然表明着值得處理的特定響應(所以爲何不直接使用標準狀態碼?)。
405 Method Not Allowed
卻返回 404
的 API 讓我瘋狂地想,「究竟我是敲錯了 URL 仍是用錯誤的 HTTP method 請求了服務?」502 Bad Gateway
(上游服務問題)而不是返回讓人困惑的 500 Internal Server Error
,那麼咱們曾經能節省許多調試問題的時間。無論你信不信,反正我是信了,在普遍被使用的 API 中正在創建一個約定,以返回狀態碼例如 201 Created
,429 Too Many Requests
以及 503 Service Unavialable
。若是你遵循這個約定,用戶將能更方便地使用你的網站/API而且解決任何他們可能遇到的問題。
在這裏面,決定何時返回何種狀態碼是最難的,然而有了正確的知識(別再說我不知道,仔細看前面的流程圖),挑選一個有意義的狀態碼變得簡單不少。
別去研究 RFC 2616,更別去研究 RFC 2068,真正有用的是 RFC 7231。