【发布时间】:2012-12-06 18:20:39
【问题描述】:
我正在为具有 List 作为查询参数的 GET 服务创建 Jersey 客户端。根据documentation,可以将List作为查询参数(此信息也在@QueryParam javadoc),请查看:
一般来说方法参数的Java类型可以:
- 是原始类型;
- 有一个接受单个字符串参数的构造函数;
- 有一个名为 valueOf 或 fromString 的静态方法,它接受单个 String 参数(例如,请参见 Integer.valueOf(String) 和 java.util.UUID.fromString(String));或
- 是 List、Set 或 SortedSet,其中 T 满足上述 2 或 3。生成的集合是只读的。
有时参数可能包含多个相同名称的值。如果是这种情况,则可以使用 4) 中的类型来获取所有值。
但是,我不知道如何使用 Jersey 客户端添加列表查询参数。
我了解替代解决方案是:
- 使用 POST 代替 GET;
- 将 List 转换为 JSON 字符串并将其传递给服务。
第一个不好,因为服务的正确 HTTP 动词是 GET。这是一个数据检索操作。
如果你不能帮助我,第二个将是我的选择。 :)
我也在开发服务,所以我可以根据需要进行更改。
谢谢!
更新
客户端代码(使用 json)
Client client = Client.create();
WebResource webResource = client.resource(uri.toString());
SearchWrapper sw = new SearchWrapper(termo, pagina, ordenacao, hits, SEARCH_VIEW, navegadores);
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
params.add("user", user.toUpperCase());
params.add("searchWrapperAsJSON", (new Gson()).toJson(sw));
ClientResponse clientResponse = webResource .path("/listar")
.queryParams(params)
.header(HttpHeaders.AUTHORIZATION, AuthenticationHelper.getBasicAuthHeader())
.get(ClientResponse.class);
SearchResultWrapper busca = clientResponse.getEntity(new GenericType<SearchResultWrapper>() {});
【问题讨论】:
-
你能在这里给球衣客户代码吗...
-
yogesh,我添加了客户端代码。
-
如果我理解您的问题陈述,您可以通过将多个值添加到同一个键来将值列表作为查询参数传递。如果“searchWrapper”是键并且您想将多个值传递给它:像这样构建 URL: //YourURL?searchWrapper=value1&searchWrapper=value2&searchWrapper=value3 如果您的 MultivaluedMap 支持,您可能需要多次向同一个键插入值.
-
谢谢@ThammeGowda!我还没有测试过它,但它似乎可以像MultivaluedMap javadoc 那样对 add 方法状态进行测试:将值添加到提供的键的当前值列表中。