Java Restlet是否在返回400个错误请求时返回415个不受支持的媒体类型?

Java Restlet是否在返回400个错误请求时返回415个不受支持的媒体类型?,java,rest,content-type,jackson,restlet-2.0,Java,Rest,Content Type,Jackson,Restlet 2.0,我在jackson中使用Restlet 2.1构建json REST api 当我使用预期的内容类型但正文格式不正确发出请求时,我会返回415“Unsupported Media type”状态代码。我认为正确的错误代码应该是400“错误请求” 显然,当杰克逊试图破译垃圾时,混音就发生了 我将尝试用一些代码使情况更清楚: // java method mapping @Post("json") public Project create(Project project) { 使用curl的服务

我在jackson中使用Restlet 2.1构建json REST api

当我使用预期的内容类型但正文格式不正确发出请求时,我会返回415“Unsupported 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
以及日志中堆栈跟踪os记录的碎片:

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的决定

现在,我的问题是:这是正确的吗?如果我正确地阅读了《RESTfulWeb服务》一书中的以下引文,则不是这样,但我愿意接受更正

[400错误请求]当客户机提交一个表示以及一个PUT或POST请求时,通常使用该表示,并且表示的格式正确,但没有任何意义

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

对还是错,我宁愿退400

有没有办法在不放弃杰克逊提供的自动魔术连续剧的情况下改变这种行为

非常感谢您的帮助,
谢谢

415是正确的,因为如果请求在任何情况下损坏,则请求的格式不正确。例如,不可解析的JSON或XML。格式错误的JSON或XML根据定义是而不是JSON或XML,因此是不受支持的媒体类型,Jackson无法知道它应该是JSON,它只知道它不能解析JSON

官员对此非常清楚

10.4.16 415不支持的媒体类型

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


你说,嘿,这是JSON,服务器并不是这么说的,嘿,我得到的不是JSON,也不受这个资源的支持。

我想这是有争议的:格式和格式是两件不同的事情(你可以有一个压缩的jpg)。我认为服务器应该发出不同的信号“嘿,你试图发送应用程序/foo,我不支持”,以及“是的,我们确实支持json,但你的数据已损坏”。解析器如何知道某个东西是json但已损坏,就像jpg解码器说这是jpg但已损坏,这毫无意义,解码器或解析器所能说的就是我试图将其解析为不可解析的东西,无法解码为图像的一组位不是JPG,就像无法解析为json的一组非文本一样。这就是内容类型http头的作用:它声明了预期的内容类型。如果发送方声明它是json,但解码器无法对其进行解码,那么这是一个错误的请求,因为它没有意义。这不是一个坏的媒体类型(因为预期的媒体类型应该是好的)。键是“…所请求方法的请求资源不支持的格式”损坏的输入符合此要求。损坏的事实与此无关,从解析器的角度来看,解析器不知道它是错误的格式还是损坏的格式。软件就是这样愚蠢的
400
如果语法格式错误,这意味着语义上与损坏不同。