一尘不染

泽西岛客户端:如何添加列表作为查询参数

java

我正在为具有List作为查询参数的GET服务创建Jersey客户。根据文档,可以将List作为查询参数(此信息也位于@QueryParam
javadoc中),将其检出:

通常,方法参数的Java类型可以:

  1. 是原始类型;
  2. 有一个接受单个String参数的构造函数;
    3.
    有一个名为valueOf或fromString的静态方法,该方法接受单个String参数(例如,参见Integer.valueOf(String)和java.util.UUID.fromString(String));要么
  3. 是List,Set或SortedSet,其中T满足上面的2或3。结果集合是只读的。

有时参数可能包含多个相同名称的值。如果是这种情况,则可以使用4)中的类型来获取所有值。

但是,我不知道如何使用Jersey客户端添加List查询参数。

我了解替代解决方案是:

  1. 使用POST而不是GET;
  2. 将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>() {});

阅读 187

收藏
2020-12-03

共1个答案

一尘不染

@GET 确实支持字符串列表

设置
Java:1.7
Jersey版本:1.9

资源资源

@Path("/v1/test")

子资源

// receive List of Strings
@GET
@Path("/receiveListOfStrings")
public Response receiveListOfStrings(@QueryParam("list") final List<String> list){
    log.info("receieved list of size="+list.size());
    return Response.ok().build();
}

球衣测试用例

@Test
public void testReceiveListOfStrings() throws Exception {
    WebResource webResource = resource();
    ClientResponse responseMsg = webResource.path("/v1/test/receiveListOfStrings")
            .queryParam("list", "one")
            .queryParam("list", "two")
            .queryParam("list", "three")
            .get(ClientResponse.class);
    Assert.assertEquals(200, responseMsg.getStatus());
}
2020-12-03