2010-11-29 85 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

相关问题