2016-04-13 78 views
0

我有一個無法更新的資源(事件)。因此,我只允許發佈&獲取操作。 (我沒有選擇PUT,因爲eventId是在服務器端生成的,並作爲響應的一部分返回)。無法更新的資源的REST響應代碼

我已經在輸入中有三個字段的組合,可用於識別唯一資源。

鑑於此,如果有人張貼相同的請求兩次,這就是我期待返回

  • 案例1:如果獨特的領域已經存在於數據庫,完整的要求是 正是因爲前一個相同,則我們忽略這個請求(因爲 資源已經存在)。
  • 情況2:如果DB中已存在唯一字段但其他部分 請求不同,則發送錯誤響應說不支持 。

什麼應該是正確響應代碼在這兩種情況下,1 &情況下返回2

感謝, 哈里什

回答

1

如果調用是冪等的,意味着情況1,我期望它返回一個200 OK因爲它沒有真正失敗,這與在執行PUT時使用相同的值更新相同。

如果該呼叫不是冪等的,意味着情況2,那麼即使用戶不應該實際重試該呼叫,我也會期望一個409衝突。這是因爲通過你所說的,實際上允許用戶發送具有相同標識符的請求,只要所有其他參數也是相同的。

另外,這只是我的直覺,如果用戶嘗試了不同的參數來查看不同類型的響應代碼,他可以確定資源的當前狀態,即使可能他不被允許讀取它。因此,根據您的應用程序的範圍,您可能想要回復相同的響應。

+0

一樣,如果該用戶不被允許閱讀,我喜歡你的可能的安全漏洞。儘管這不是我目前的用例。對於案例2,如何使用422? – Harish

+0

響應422特別針對像語義錯誤這樣的情況,在你的情況下,它也不是真的,因爲如果第二個請求是第一個請求,它的語義也是正確的。第二個請求沒有指定超出範圍的參數或類似的東西,所以我會說這不是422. – ChatterOne

+0

謝謝。當然有意義的是,如果第二個請求是第一個請求的話,那麼它就不可能在語法上成爲正確的語法。感謝您的澄清。情況1和情況2將使用200。 – Harish

1

編輯:

因爲無論是409還是400適合你的情況下,或許422 Unprocessable Entity

http://www.restpatterns.org/HTTP_Status_Codes/422_-_Unprocessable_Entity


也許409衝突是你在找什麼。

https://httpstatuses.com/409

如果你想發信號給客戶端,失敗是「最終」,不要求編輯將改變這種狀況,另一種選擇是400錯誤的請求

就個人而言,我只在請求語法非法時才使用400 - 這裏不是這種情況。

+0

我看到了..但409說,用戶可以在更正後重新提交請求。但在我的情況下,它只是不受支持,用戶不應該重試,因爲資源已經存在,我們不支持更新。因此,我不能使用409 – Harish

+0

然後可能會考慮400個,因爲很多/大多數人會認爲使用它不合適。 – morsor

+1

或422無法處理的實體 – morsor