2010-11-29 78 views
5

我使用傑克遜的Restlet 2.1來構建json REST api。當Restlet返回400錯誤請求時,Restlet是否返回415 Unsupported Media Type?

當我用期望的內容類型但格式不正確的機構發出請求時,我得到一個415「Unsuppored Media Type」狀態代碼。我認爲正確的錯誤代碼應該是400「錯誤請求」。

顯然,當傑克遜嘗試並未能解碼垃圾時,會發生混淆。

我會盡力的情況下作出了一些代碼更加清晰:

// java method mapping 
@Post("json") 
public Project create(Project project) { 

服務調用,捲曲

$ curl -i -XPOST -H 'content-type: application/json' -d '{xgarbage}' http://localhost:8080/projects HTTP/1.1 415 Unsupported Media Type 

並在日誌中的堆棧跟蹤OS recorde的fragmente:

Nov 29, 2010 9:51:56 PM org.restlet.ext.jackson.JacksonRepresentation getObject 
WARNING: Unable to parse the object with Jackson. 
org.codehaus.jackson.JsonParseException: Unexpected character ('x' (code 120)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: [email protected]; line: 1, column: 2] 
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:929) 

該服務的實際實施從未被擊中,所以在某個地方作出決定的地圖將亂碼內容改爲415.

現在,我的問題是:這是正確的嗎?如果我正確地閱讀了「REST風格的Web服務」一書中的以下引用,但這不是,但我願意更正。

[400錯誤請求]當客戶端提交表示以及PUT或POST請求,並且表示格式正確但沒有任何意義時,通常使用它。

[415 Unsupported Media Type]如果客戶端發送的文檔具有正確的媒體類型但格式錯誤(例如用錯誤詞彙表編寫的XML文檔),則更好的響應是更通用的400( 「錯誤的請求」)

對還是錯,我寧願返回一個400

有沒有辦法改變的行爲,而在傑克遜提供的自動魔法系列化放棄?

任何幫助,非常感謝, 謝謝!

回答

3

415是正確的,因爲請求是而不是如果它在任何情況下被損壞,則它是正確的格式。例如不可解析的JSON或XML。格式錯誤的JSON或XML是不是 JSON或XML的定義,因此是不受支持的媒體類型,Jackson沒有辦法知道它應該是JSON,它只是知道它不是JSON,它可以解析。

官方documentation真的很清楚這一點。

10.4.16 415不支持的媒體類型

服務器拒絕,因爲請求的實體是不被請求方式所請求的資源支持的格式來請求服務。

你說,嘿,這是JSON,它不是這樣的服務器說,嘿,我得到的不是JSON,並不支持此資源。

+2

我想這是有爭議的:格式化和格式良好是兩個不同的東西(你可以有一個corruped jpg)。我認爲服務器應該以不同的方式表示「嘿,你試圖發送apllication/foo,我不支持它」,並且「是的,我們確實支持json,但是你的數據被破壞了」。 – 2010-11-30 16:30:11

相關問題