我知道這是一個相當普遍的問題,但我還沒有找到滿足我的答案。HTTP 200或404爲空列表?
我一直在使用Django rest框架一段時間了,但除了給出的例子外,這大部分都是不相關的。它的默認行爲是在訪問具有空項目列表的路由時,返回帶有空列表資源的HTTP 200。 例如: - 如果我們有一個途徑,例如/articles/
訪問的文章列表但它不包含項目,我們會得到像下面這樣的JSON響應:
{"count":0, "next":null, "previous":null, "items": []}
這是完全正常的。我們在/ articles /找到了我們正在尋找的資源,它恰好沒有任何項目。
如果我們訪問路線/articles/?page=1
,我們得到完全相同的響應。
到目前爲止這麼好。現在我們嘗試訪問/articles/?page=2
,並且響應代碼發生更改。現在得到一個404
就好像資源找不到,並顯示錯誤消息說該頁面沒有結果。這與使用相同的情況?page = 1 ...
我對此行爲非常滿意,但今天我開始質疑此設計。 ?page=1
與?page=2
有什麼不同?而且,如何在發出HEAD請求時判斷請求是否「有效」?在包含任何結果的意義上有效。
這對於篩選列表來檢查某個字段的可用性(例如,向/users/?username=ted
發出HEAD
請求)時可能會有用。
- 200響應顯然意味着請求被理解並找到了項目。
- 404將意味着請求被理解,但被發現在該位置沒有物品/ URI(AFAIK查詢參數也URI的一部分)
- 如果請求不能被理解400將被返回用於語法錯誤,用於語義錯誤422。
這是一個很好的設計嗎?爲什麼大多數人似乎不同意它,它有什麼缺點?
恕我直言,200更好,因爲404不允許區分* no api部署*和*空列表*。 –
這在概念上是不是一樣?該位置沒有資源。客戶不應該(理論上)在適當的休息實施中擔心端點,所以差異應該不重要(理論上在適當的休息api下)。 –
我看到它的方式:'/ articles /'是所有文章的列表;即使它是空的,它仍然存在。而在大多數網站上,即使是空白列表也有第一頁,告訴你沒有結果。 –