2013-10-06 40 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