【发布时间】:2011-05-17 13:23:55
【问题描述】:
我正在使用带有 jackson 的 Restlet 2.1 来构建一个 json REST api。
当我使用预期的内容类型但正文格式不正确时,我会返回 415“不支持的媒体类型”状态代码。我认为正确的错误代码应该是 400 "Bad Request"。
显然,当杰克逊尝试解码垃圾但未能成功时,就会发生混淆。
我会尝试用一些代码使情况更清楚:
// 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 Bad Request] 常用于客户端连同 PUT 或 POST 请求一起提交表示,并且表示格式正确,但没有任何意义。
.
[415 Unsupported Media Type] 如果客户端发送的文档具有正确的媒体类型但格式错误(例如使用错误词汇表编写的 XML 文档),更好的响应是更通用的 400(“Bad Request ”)
对与错,我宁愿返回 400。
有没有办法改变行为而不放弃杰克逊提供的自动魔法序列化?
非常感谢任何帮助, 谢谢!
【问题讨论】:
标签: java rest content-type jackson restlet-2.0