簡體   English   中英

REST-API,無效DELETE的正確HTTP狀態代碼

[英]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響應不同,身份驗證不會產生任何影響。

另請參閱資源可用但由於權限無法訪問時更正HTTP狀態代碼


我在現有資源上使用了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 / 403401是“你還沒有登錄呢。” 403是“您已登錄,並且您無權執行您想要的操作”。 我在使用這些代碼時沒有看到任何異常。

說完這一切之后,我覺得我在某種程度上誤解了這個問題。

我不喜歡404的概念表示無法找到資源的失敗刪除(或者對於那個問題的put或補丁)。 有DNS問題並且人們有基於參數的路由問題是很常見的,如果找不到實際的站點,這兩個問題都會產生404。 引入這種模糊性可以使診斷簡單問題真正地和不必要地困難。 我認為410 Gone是表示 API所不具備的資源的更好選擇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM