0

我有一个 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>?我的 curl 请求不正确吗?

4

2 回答 2

4

看起来您正在发送 POST 请求

--data-binary <数据>

(HTTP) 这 完全按照指定的方式发布数据,没有任何额外的处理。

由于-X设置了自定义请求类型,我猜它没有检测到它需要对数据进行 URL 编码:

-X, --request <命令>

(HTTP) 指定与 HTTP 服务器通信时使用的自定义请求方法。将使用指定的请求而不是其他使用的方法(默认为 GET)。阅读 HTTP 1.1 规范以获取详细信息和解释。常见的附加 HTTP 请求包括 PUT 和 DELETE,但 WebDAV 等相关技术提供 PROPFIND、COPY、MOVE 等。

所以尝试使用-G

-G,--得到

使用时,此选项将使所有使用 -d、--data 或 --data-binary 指定的数据在 HTTP GET 请求中使用,而不是在其他情况下使用的 POST 请求中使用。数据将附加到带有“?”的 URL 分隔器。

于 2012-11-26T22:15:24.463 回答
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

有用 :)

于 2012-11-26T22:47:20.923 回答