[英]Is Restlet returning 415 Unsupported Media Type when it should return 400 Bad Request?
我正在使用Restlet 2.1与jackson构建一个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。
有没有办法改变行为而不放弃杰克逊提供的自动魔术序列化?
非常感谢任何帮助,谢谢!
415是正确的,因为如果请求无论如何都被破坏,请求的格式不正确。 例如,不可解析的JSON或XML。 根据定义,格式错误的JSON或XML 不是 JSON或XML,因此是不受支持的媒体类型,杰克逊无法知道应该是JSON,它只知道它可以解析它不是JSON。
官方文档非常清楚这一点。
10.4.16 415不支持的媒体类型
服务器拒绝为请求提供服务,因为请求的实体采用所请求方法的请求资源不支持的格式。
你说,嘿这是JSON,并不是服务器说的,嘿,我得到的不是JSON而且不受这个资源的支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.