我正在使用带有jackson的Restlet 2.1构建一个json REST api。
当我使用预期的内容类型但身体格式错误发出请求时,我会收到415“Unsuppored 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
堆栈跟踪的碎片记录在日志中:
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.
现在,我的问题是:这是正确的吗?如果我正确地阅读了“RESTful Web Services”一书中的以下引用,那就不是,但我愿意接受更正。
[400错误请求]它通常在客户端提交表示以及PUT或POST请求时使用,并且表示格式正确,但它没有任何意义。
[415不支持的媒体类型]如果客户端发送的文档具有正确的媒体类型但格式错误(例如用错误的词汇表编写的XML文档),则更好的响应是更通用的400(“错误请求” “)
对或错,我宁愿返回400。
有没有办法在不放弃杰克逊提供的自动魔术序列化的情况下改变行为?
非常感谢任何帮助, 谢谢!
答案 0 :(得分:3)
415是正确的,因为如果请求以正确的格式 NOT ,则无论如何它都会被破坏。例如,不可解析的JSON或XML。根据定义,格式错误的JSON或XML NOT JSON或XML,因此是不受支持的媒体类型,杰克逊无法知道它应该是JSON,它只知道它不是' t它可以解析的JSON。
官方documentation对此非常清楚。
10.4.16 415不支持的媒体类型
服务器拒绝为请求提供服务,因为请求的实体采用所请求方法所请求资源不支持的格式。
你说,嘿,这是JSON,并不是服务器说的,嘿,我得到的不是JSON而且不受这个资源的支持。