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,并且不受此资源支持。
归档时间: |
|
查看次数: |
15621 次 |
最近记录: |