簡體   English   中英

當Restlet返回400 Bad Request時,它是否返回415不支持的媒體類型?

[英]Is Restlet returning 415 Unsupported Media Type when it should return 400 Bad Request?

我正在使用Restlet 2.1與jackson構建一個json REST api。

當我使用預期的內容類型但是格式錯誤的主體發出請求時,我會收到415“Unsuppored Media Type”狀態代碼。 我認為正確的錯誤代碼應為400“錯誤請求”。

顯然,當傑克遜嘗試並且無法解碼垃圾時,混合就會發生。

我將嘗試用一些代碼使案例更清晰:

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

curl的服務調用

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

並且堆棧跟蹤的碎片記錄在日志中:

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: java.io.ByteArrayInputStream@693e4a5a; line: 1, column: 2]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:929)

該服務的實際實現從未被命中,因此某處決定將亂碼內容映射到415。

現在,我的問題是:這是正確的嗎? 如果我正確地閱讀了“RESTful Web Services”一書中的以下引用,那就不是,但我願意接受更正。

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

[415不支持的媒體類型]如果客戶端發送的文檔具有正確的媒體類型但格式錯誤(例如用錯誤的詞匯表編寫的XML文檔),則更好的響應是更通用的400(“錯誤請求”)

對或錯,我寧願返回400。

有沒有辦法改變行為而不放棄傑克遜提供的自動魔術序列化?

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

415是正確的,因為如果請求無論如何都被破壞,請求的格式正確。 例如,不可解析的JSON或XML。 根據定義,格式錯誤的JSON或XML 不是 JSON或XML,因此是不受支持的媒體類型,傑克遜無法知道應該是JSON,它只知道它可以解析它不是JSON。

官方文檔非常清楚這一點。

10.4.16 415不支持的媒體類型

服務器拒絕為請求提供服務,因為請求的實體采用所請求方法的請求資源不支持的格式。

你說,嘿這是JSON,並不是服務器說的,嘿,我得到的不是JSON而且不受這個資源的支持。

暫無
暫無

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

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