当Restlet返回400 Bad Request时,它是否返回415不支持的媒体类型?

Mat*_*ari 5 java rest content-type jackson restlet-2.0

我正在使用Restlet 2.1与jackson构建一个json REST api.

当我使用预期的内容类型但是格式错误的主体发出请求时,我会收到415"Unsuppored Media Type"状态代码.我认为正确的错误代码应为400"错误请求".

显然,当杰克逊尝试并且无法解码垃圾时,混合就会发生.

我将尝试用一些代码使案例更清晰:

// java method mapping
@Post("json")
public Project create(Project project) {
Run Code Online (Sandbox Code Playgroud)

curl的服务调用

$ curl -i -XPOST -H 'content-type: application/json' -d '{xgarbage}' http://localhost:8080/projects HTTP/1.1 415 Unsupported Media Type
Run Code Online (Sandbox Code Playgroud)

并且堆栈跟踪的碎片记录在日志中:

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)
Run Code Online (Sandbox Code Playgroud)

该服务的实际实现从未被命中,因此某处决定将乱码内容映射到415.

现在,我的问题是:这是正确的吗?如果我正确地阅读了"RESTful Web Services"一书中的以下引用,那就不是,但我愿意接受更正.

[400错误请求]它通常在客户端提交表示以及PUT或POST请求时使用,并且表示格式正确,但它没有任何意义.

.

[415不支持的媒体类型]如果客户端发送的文档具有正确的媒体类型但格式错误(例如用错误的词汇表编写的XML文档),则更好的响应是更通用的400("错误请求")

对或错,我宁愿返回400.

有没有办法改变行为而不放弃杰克逊提供的自动魔术序列化?

非常感谢任何帮助,谢谢!

小智 3

415 是正确的,因为如果请求无论如何都被损坏,则其格式不正确。例如不可解析的 JSON 或 XML。根据定义,格式错误的 JSON 或 XML 不是JSON或 XML,因此是一种不受支持的媒体类型,Jackson 无法知道它应该是 JSON,它只是知道它不是它可以解析的 JSON。

官方文档对此说得很清楚。

10.4.16 415 不支持的媒体类型

服务器拒绝为该请求提供服务,因为所请求的方法所请求的资源不支持该请求的实体格式。

你说,嘿,这是 JSON,但它不是,所以服务器说,嘿,我得到的不是 JSON,并且不受此资源支持。

  • 我想这是有争议的:采用某种格式和格式良好是两件不同的事情(你可以有一个损坏的 jpg)。我认为服务器应该发出不同的信号“嘿,你试图发送 application/foo,但我不支持它”,以及“是的,我们确实支持 json,但你的数据已损坏”。 (2认同)