2016-03-21 104 views
1

這基本上是最佳實踐的問題。在我Rest API(我目前正在使用的)中,我有路由匹配PUTDELETE請求的網址,例如/resources/{resourceID}。 API的後面是SQL DB。Rest API更新/刪除 - 檢查資源是否存在?

一般情況下,執行在SQL數據庫上不存在的資源ID DELETEUPDATE查詢沒有給出錯誤,只有affectedRows返回0

現在我對如何正確地執行這樣的請求一個問題:

  1. 檢查是否與給定的ID的資源是否存在之前UPDATEDELETE(其涉及額外的SQL查詢)
  2. 觸發UPDATE/DELETE無覆蓋查詢ut檢查是否存在並檢查SQL查詢的結果,並在affectedRows == 0的情況下返回HTTP 404

我個人比較喜歡後者。但是我可以想到其他DBMS(不是SQL或不關聯)執行INSERT,UPDATEDELETE查詢可能不會返回任何有關受影響行的信息。如何在這種情況下進行?

+1

看看這裏:https://github.com/for-GET/http-decision-diagram –

回答

1

一旦您使用資源ID執行DELETEUPDATE操作,我在檢查受影響的行數時看不到任何問題。這應該足以檢查您的資源是否存在。

基本上:

  • 對於那些受影響的行可以檢查數據庫,只是執行DELETEUPDATE
  • 對於此功能不可用的數據庫,請先執行查詢。
1

作爲API的用戶,我希望得到一個不存在的資源的HTTP 404,而不依賴於所使用的HTTP方法。

我試圖刪除/users/ted當我真的想刪除/users/tod可能是一個巨大的問題。沒有404我會假設一切正常,我想刪除的用戶實際上已被刪除。實際上,我刪除了一個不存在的用戶。

+0

這是顯而易見的。我更感興趣的是考慮是否執行額外的查詢以查明資源是否存在或在對不存在的資源執行DELETE/UPDATE之後依賴於數據庫引擎的結果......以及如何在數據庫引擎不處理時處理此問題在這種情況下提供任何有用的結果... – shadyyx

+0

所以你的問題不是關於標籤API或休息,但更多的數據庫相關。正如其他人指出的那樣,您應該儘可能多地使用數據庫的可能性。如果不支持,請先刪除它,然後再選擇該行。 –

0

在更新服務我回到201 (CREATED)的情況下,資源是不存在的,你想你的服務是「寬容」,如果你希望你的客戶必須嚴格遵守的協議,否則返回404。 在刪除的情況下,如果客戶端試圖刪除不存在的資源,或者如果您跟蹤已刪除的資源(某些服務執行該操作,它們只是標記'已刪除'的資源,例如爲了給客戶端撤消操作的機會),您可以返回409 (CONFLICT)以通知客戶端資源已被刪除。 如果DBMS沒有提供有關受影響行的線索,則可以在執行操作(無論是插入,更新還是刪除)之前查詢資源。這有點矯枉過正,但如果這是在對其採取行動之前瞭解資源狀態的唯一方法,並且您不希望出現性能問題,那麼這可能是一個可行的解決方案。