[英]REST-API Returns plain text for status code 200 and json for status code 400
[英]REST-API, proper HTTP status code for invalid DELETE
我正在設計一個RESTful API,它使用HTTP狀態代碼和動詞作為通信的關鍵組件。
在宗教層面上,它是在RESTafarian的狂熱者一面。
決定HTTP狀態代碼的經驗法則是此圖或類似資源。
GET /api/documents/1
- 401
用戶尚未登錄 GET /api/documents/1
- 200
用戶有權限 GET /api/documents/1
- 403
用戶無權限 DELETE /api/documents/1
- 204
用戶有權限 DELETE /api/documents/1
- 403
用戶沒有權限 GET /api/documents/2
- 404
用戶權限無關,資源不存在 DELETE /api/documents/2
- 404
用戶權限無關,資源不存在 DELETE /api/documents/1
- 404
用戶擁有權限,資源已被刪除 DELETE /api/documents/1
- 404
用戶沒有權限,資源已被刪除 目標:
在這種情況下,有許多不同的狀態代碼可供選擇(404,403,410,405),在我的情況下,我在現有資源上使用403,如果它不是你的不清除緩存,而404是非所有非現有資源,以告訴客戶擦除該數據。
但我不喜歡在不屬於你的資源上從403切換到404。
我很想聽聽其他人如何解決這個用例,或者一般情況下你認為適合發送所有無效DELETE調用的狀態代碼,因為我認為這是最難以簡明扼要的問題之一。
(整個互聯網上的很多REST討論和答案都只是“扔了400個糟糕的請求,無論如何都不關心”,我沒有需要快速修復或務實破解的問題。謝謝)
常規指針:如果資源存在但用戶無權對其執行操作,則應返回403 over 403:
401未經授權
與403 Forbidden類似,但專門用於需要身份驗證且失敗或尚未提供的情況。
和
403禁止
請求是有效請求,但服務器拒絕響應它。 與401 Unauthorized響應不同,身份驗證不會產生任何影響。
我在現有資源上使用了403,如果它不是你不清除緩存,而是在所有非現有資源上使用404,以告訴客戶端擦除這些數據。
如前所述,應使用401而不是403.如果您只想說“抱歉,資源未找到”,則可以返回404。 如果你想說“資源在這里,但它不再存在而且永遠不會”(在你的情況下似乎是這種情況)你可以返回410:
410已經走了
表示請求的資源不再可用,並且不再可用。 當有意刪除資源並清除資源時,應使用此方法。 在收到410狀態代碼后,客戶端將來不應再次請求該資源。 搜索引擎等客戶端應從索引中刪除資源
總而言之,這是我在你的情況下實現它的方式。 我做的改變是粗體 。
GET /api/documents/1
- 401
用戶尚未登錄 GET /api/documents/1
- 200
用戶有權限 GET /api/documents/1
- 401用戶沒有權限 DELETE /api/documents/1
- 204
用戶有權限 DELETE /api/documents/1
- 403用戶沒有權限 GET /api/documents/2
- 404
用戶權限無關,資源不存在 DELETE /api/documents/2
- 404
用戶權限無關,資源不存在 DELETE /api/documents/1
- 410用戶有權限,資源已被刪除 DELETE /api/documents/1
- 401用戶沒有權限,資源已被刪除 對於最后一個,如果您不希望未經授權的用戶知道有資源已被刪除,您可以返回401。 如果你不在乎你可以返回410.那是由你來決定的。
我不喜歡在不屬於你的資源上從403切換到404。
根據情況,返回不同的狀態代碼是完全正常的。
我希望這能幫到你一點點。
無效刪除調用的響應代碼取決於失敗的原因。 在你的情況下,我會選擇:
DELETE /api/documents/1
- 用戶有權限
204 No Content
DELETE /api/documents/2
- 用戶權限無關,資源不存在
404 Not Found
DELETE /api/documents/1
- 用戶擁有權限,資源已被刪除
410 Gone
DELETE /api/documents/1
- 用戶沒有權限,資源已被刪除
403 Forbidden
最后一個電話是唯一一個真正值得談論的電話。 我相信(並且您的圖表同意)用戶缺少權限優先於已刪除的資源。 如果用戶獲得410,那么您將泄漏信息(資源已被刪除)。
至於401
/ 403
, 401
是“你還沒有登錄呢。” 403
是“您已登錄,並且您無權執行您想要的操作”。 我在使用這些代碼時沒有看到任何異常。
說完這一切之后,我覺得我在某種程度上誤解了這個問題。
我不喜歡404的概念表示無法找到資源的失敗刪除(或者對於那個問題的put或補丁)。 有DNS問題並且人們有基於參數的路由問題是很常見的,如果找不到實際的站點,這兩個問題都會產生404。 引入這種模糊性可以使診斷簡單問題真正地和不必要地困難。 我認為410 Gone是表示 API所不具備的資源的更好選擇 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.