簡體   English   中英

REST API用戶嘗試訪問對象時使用哪個HTTP狀態代碼並出現錯誤?

[英]Which HTTP status code to use when REST API user is trying to acces an object and there is an error?

我想找到適當的狀態代碼返回,這是我到目前為止的想法:

  1. GET /api/documents/1 - 文檔存在,用戶有權訪問 - 200 OK
  2. GET /api/documents/2 - 文檔存在,用戶無權訪問 - 403 Forbidden
  3. GET /api/documents/3 - 文件不存在(無法檢查是否有訪問權限) - 404 Not Found? 403禁止?
  4. GET /api/documents/a - id無效(應該是一個數字) - 400 Bad Request? 404找不到? 403禁止?

我的后端(使用MongoDB)目前的問題是,我做的第一件事是檢查用戶是否可以通過檢查文檔ID來查看他有權訪問的文檔ID列表。 如果在列表中找不到document_id,則會自動返回403 Forbidden。 這有助於我避免首先從數據庫中獲取文檔以查看用戶是否可以訪問它。

我不確定這里最好的做法是什么 - 我應該追求更好的HTTP狀態代碼(從而創建額外的數據庫請求),還是最后2個案例(3和4)的403 Forbidden工作?

我會為#3和#4建議404

1. GET / api / documents / 1 - 文檔存在,用戶有權訪問 - 200 OK

200是合適的。

2. GET / api / documents / 2 - 文檔存在,用戶無權訪問 - 403禁止訪問

403是合適的。

3. GET / api / documents / 3 - 文件不存在(無法檢查是否有訪問權限) - 404 Not Found? 403禁止?

這里404是合適的,因為文檔不存在於指定的URI中。

4. GET / api / documents / a - id無效(應該是一個數字) - 400 Bad Request? 404找不到? 403禁止?

這里仍然適合404 ,因為指定的URI上不存在資源。 作為參考, 400指的是格式錯誤的語法 ,但URI和請求在語法上完全有效; 只是您的服務器上沒有相應的資源可用。

通常,您應首先考慮API並遵循標准HTTP方法。 這是否需要另一個內部數據庫請求是一個實現細節。 我建議避免過早優化,特別是那些會對客戶產生直接影響的優化。

我會說使用HTTP代碼按照預期的方案#3,使用404(因為找不到資源,但用戶本來就有訪問權限),因為方案#4使用400(因為它確實是一個錯誤的請求)。

這個井幫助您的實施客戶了解究竟出了什么問題。 特別是對於404,在許多系統中會出現正常操作(即查詢登錄憑證或類似內容),客戶可能需要了解其請求未得到滿足的確切原因。

我沒有看到返回正確的狀態代碼將導致更多的數據庫請求。 您仍然可以返回403用於合法的403用例。

暫無
暫無

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

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