2013-10-06 36 views
1

我正在使用Play創建RESTful服務。我希望Play在請求標題中拒絕媒體類型未指定爲JSON的任何請求。Play Framework:返回400而不是415

那裏的教程有一個很好的例子。 http://www.playframework.com/documentation/2.0/JavaJsonRequests

閱讀的地方說......

@BodyParser.Of(Json.class) 
public static index sayHello() { 
    String name = json.findPath("name").getTextValue(); 
    if(name == null) { 
    return badRequest("Missing parameter [name]"); 
    } else { 
    return ok("Hello " + name); 
    } 
} 

注:這樣一來,一個400 HTTP響應將自動返回非JSON請求。

爲什麼它返回HTTP錯誤400,錯誤的請求,而不是HTTP錯誤415,不支持的媒體類型?

有沒有辦法改變這種行爲?

+1

我不知道,如果他們談論的標題或內容。如果頭部設置爲json,但內容爲另一種格式,則400響應看起來很好。如果它是關於標題而不是你說得對,415似乎更合適。你測試過了,看到了錯誤的迴應嗎?如果是的話,如果還沒有,你可以提交一個錯誤報告。 – Kapep

+1

Kapep的澄清請求是一個很好的要求。如果您在請求中將「Content-header」設置爲「application/json」,並且您收到了400有效json **的400,那麼您在BodyParser中間件中發現了一個錯誤。如果您的JSON格式不正確或標題未發送,則400可以。一個可能的解決方法是可能爲body構建您自己的JSON解析註釋(也許通過擴展現有的bodyparser),儘管這看起來像是矯枉過正。 –

+0

我想我總是得到400讓我檢查。非常感謝。 –

回答

2

可以返回與狀態(INT,String)方法的自定義HTTP響應:

return status(415, "The only supported content type is application/json"); 
+0

除非我誤解了415,否則我不確定缺少參數或格式不正確的JSON會構成415. request()。body()。asJson();由於很多原因可能會返回null。 JSON可能格式不正確,但Content-type頭仍然被視爲application/json,所以它仍然不是您正在獲取的非更新媒體,而是一個格式不正確的媒體。 –

+1

我認爲回答者意味着你可以直接從你的代碼中返回415,但是沒有花時間來顯示新的錯誤信息。我冒昧地編輯答案。希望沒關係,@aaberg。 –

+1

沒問題@RayToal :) – aaberg