18

我有這樣的銷售/客戶/ {} customerno的資源。如果客戶端發送一個PUT請求到這個資源我將返回400 - 錯誤的請求,如果在實體中的XML不是有效的XML。但是,如果xml有效,但xml的內容無效,該怎麼辦?例如說客戶端試圖更新客戶郵編,並提供其郵編無效。返回400是否正確 - 在這種情況下的錯誤請求,還是我應該使用的另一個http代碼?REST - 當使用400( 「錯誤的請求」)

回答

24

Wikipedia's List of HTTP Status Codes

400錯誤的請求: 要求不能得到滿足,由於惡劣的語法。

在這種情況下,您的客戶端向您發送了一個無效的郵政編碼的XML負載,這是一種無效的語法形式;因此,在這種情況下,發送400錯誤請求是一個適當的錯誤代碼。

此外,維基百科援引RFC-4918因爲關於這一主題的資源。從這個文件,你會發現以下信息:

服務器可能拒絕可疑的請求(即使 它們是由形成良好的XML),例如,一個400(壞 請求)狀態碼一個可選的響應主體說明 問題。

既然你的要求是格式良好的(在XML不壞,它只是包含語義上不正確的信息),你可以拒絕與狀態碼400字*may*表明,還有其他選擇的內容。

雖然您可能會試圖使用狀態碼422,但在這種情況下,這樣做並不正確,因爲無效的郵政編碼不符合標準是語義錯誤。閱讀下面...

維基百科:

422無法處理的實體(WebDAV的; RFC 4918): 良好形成的請求,但是由於語義錯誤無法被遵守。

另外,這裏有一些definitions to assist in the interpretation of status code 422:輸入代碼解析期間發生

  • 語法錯誤,並通過語法不正確語句引起的。典型錯誤可能是在輸入非法字符,丟失的運算符,兩個運營商成一排,其間沒有分號,不對稱的括號,錯位的保留字等發生

  • 語義錯誤同一線路兩種說法在代碼執行過程中,在它被解析爲語法正確之後。這些不得與陳述的構建方式有關,而應涉及陳述的意思。諸如不正確的變量類型或大小,不存在的變量,下標超出範圍等是語義錯誤。

你無效郵政編碼既不是一個語法錯誤,也不是一個語義錯誤;因此,排除狀態碼422作爲選項是合理的。

要回答你的問題,狀態碼400爲宜;不過,您也可以選擇其他選項。

+0

而其他選項? –

+2

我發現這個有用,但我有點困惑的結論。我明白,有一種「語義」的計算機科學定義與其一般用法不同。除了計算機科學之外,在這種情況下,無效的郵政編碼確實可以被稱爲語義錯誤。我懷疑你是正確的,特別是RFC在計算機科學意義上的意思,但那麼這樣的錯誤會有多大用處?事實上,它怎麼會是一個* client *錯誤呢? – Semicolon

+0

@Semicolon - 我的理解是,如果良好形成的XML中,但郵政編碼不在範圍內,能夠滿足在最後一顆子彈點的定義。例如,在美國,123456將是一個糟糕的郵政編碼,但它不會是無效的XML。如果發回給客戶,說明「400錯誤請求 - 請輸入有效的郵政編碼」的錯誤可能會有所幫助。希望這可以幫助。 – jmort253

17

HTTP規範的修訂版中發現here已經更新了措辭儘量避免這種混亂約400侷限於只是畸形請求。

7.4.1。 400錯誤請求

由於客戶端 錯誤(例如格式錯誤的語法),服務器無法處理請求或不會處理請求。

+0

400代碼是否還包含有效載荷中的用戶不是資源所有者的ID? – Elisabeth

+0

@伊麗莎白不知道我完全理解你的情況,但我認爲答案是肯定的。 –

+0

該場景是一個有效載荷,它帶有一些屬於另一個用戶的外鍵ID。刪除服務器上的這些ID將會刪除另一個用戶的資源。那真的很糟糕。 – Elisabeth