我有一个REST服务。 GET方法的输入类型是List<String>
:
@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<myObject> getData(List<String> IDs) {
....
}
我尝试使用curl测试此方法。我使用了很多不同的数据组合:
curl -X GET --data-binary '{"IDs":["TestString1","TestString2"]}' -H "Content-Type: application/json" http://localhost:8080/myModule/rs/getData -v
'{"TestString1","TestString2"}'
'["TestString1","TestString2"]'
so on
但我总是得到回应:
Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
or
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
是否可以将输入设为List<String>
?我的卷毛请求不正确吗?
答案 0 :(得分:4)
看起来你是sending a POST request:
- 数据二进制&lt;数据&GT;
(HTTP)此发布数据完全符合指定,无需任何额外处理。
自-X
sets a custom request type以来,我猜测它没有检测到它需要对数据进行URL编码:
-X, - request&lt;命令&GT;
(HTTP)指定与HTTP服务器通信时要使用的自定义请求方法。将使用指定的请求而不是使用的方法(默认为GET)。阅读HTTP 1.1规范以获取详细信息和说明。常见的附加HTTP请求包括PUT和DELETE,但WebDAV等相关技术提供PROPFIND,COPY,MOVE等。
请尝试使用-G
代替:
-G, - get
使用时,此选项将使用-d, - data或--data-binary指定的所有数据在HTTP GET请求中使用,而不是使用否则将使用的POST请求。数据将附加到带有'?'的URL分隔器。
答案 1 :(得分:0)
我找到了解决方案:)
方法签名应为
@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<myObject> getData(@QueryParam("myParamName") List<String> IDs) {
....
}
卷曲请求
curl -X GET -H "Content-Type: application/json" http://localhost:8080/myModule/rs/getData?myParamName={dfsf,ddsfdss,sdfsf} -v
它有效:)