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

我正在为具有列表作为查询参数的GET服务创build一个Jersey客户端。 根据文档 ,有可能有一个列表作为查询参数(这个信息也在@QueryParam javadoc),检查出来:

通常,方法参数的Javatypes可以:

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

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

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

我了解替代解决scheme是:

  1. 使用POST而不是GET;
  2. 将List转换为JSONstring并将其传递给服务。

第一个不好,因为服务的正确的HTTP动词是GET。 这是一个数据检索操作。

如果你不能帮助我,第二个是我的select。 🙂

我也在开发服务,所以我可以根据需要进行更改。

谢谢!

更新

客户端代码(使用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>() {}); 

@GET支持string列表

设置
Java:1.7
泽西岛版本: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(); } 

泽西岛testing箱

 @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()); } 

如果你发送简单的string以外的任何东西,我会build议使用一个适当的请求正文的POST,或作为一个适当的编码的JSONstring传递整个列表。 但是,对于简单的string,只需要将每个值附加到请求URL,Jersey就会为您反序列化它。 所以给出以下示例端点:

 @Path("/service/echo") public class MyServiceImpl { public MyServiceImpl() { super(); } @GET @Path("/withlist") @Produces(MediaType.TEXT_PLAIN) public Response echoInputList(@QueryParam("list") final List<String> inputList) { return Response.ok(inputList).build(); } } 

您的客户将发送一个相应的请求:

GET http://example.com/services/echo?list=Hello&list=Stay&list=Goodbye

这将导致inputList被反序列化以包含值“Hello”,“Stay”和“Goodbye”

我同意你上面提到的替代解决scheme

 1. Use POST instead of GET; 2. Transform the List into a JSON string and pass it to the service. 

并且由于其Impl类MultivaluedMapImpl有能力接受string键和string值,所以不能将List添加到MultiValuedMap 。 如下图所示

在这里输入图像说明

仍然想要做的事情比尝试下面的代码。

控制器类

 package net.yogesh.test; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import com.google.gson.Gson; @Path("test") public class TestController { @Path("testMethod") @GET @Produces("application/text") public String save( @QueryParam("list") List<String> list) { return new Gson().toJson(list) ; } } 

Cleint类

 package net.yogesh.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.ws.rs.core.MultivaluedMap; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.core.util.MultivaluedMapImpl; public class Client { public static void main(String[] args) { String op = doGet("http://localhost:8080/JerseyTest/rest/test/testMethod"); System.out.println(op); } private static String doGet(String url){ List<String> list = new ArrayList<String>(); list = Arrays.asList(new String[]{"string1,string2,string3"}); MultivaluedMap<String, String> params = new MultivaluedMapImpl(); String lst = (list.toString()).substring(1, list.toString().length()-1); params.add("list", lst); ClientConfig config = new DefaultClientConfig(); com.sun.jersey.api.client.Client client = com.sun.jersey.api.client.Client.create(config); WebResource resource = client.resource(url); ClientResponse response = resource.queryParams(params).type("application/x-www-form-urlencoded").get(ClientResponse.class); String en = response.getEntity(String.class); return en; } } 

希望这会帮助你。

GET请求与JSON查询参数

 package com.rest.jersey.jerseyclient; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; public class JerseyClientGET { public static void main(String[] args) { try { String BASE_URI="http://vaquarkhan.net:8080/khanWeb"; Client client = Client.create(); WebResource webResource = client.resource(BASE_URI); ClientResponse response = webResource.accept("application/json").get(ClientResponse.class); /*if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } */ String output = webResource.path("/msg/sms").queryParam("search","{\"name\":\"vaquar\",\"surname\":\"khan\",\"ext\":\"2020\",\"age\":\"34\""}").get(String.class); //String output = response.getEntity(String.class); System.out.println("Output from Server .... \n"); System.out.println(output); // } catch (Exception e) { e.printStackTrace(); } } } 

发布要求:

 package com.rest.jersey.jerseyclient; import com.rest.jersey.dto.KhanDTOInput; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.json.JSONConfiguration; public class JerseyClientPOST { public static void main(String[] args) { try { KhanDTOInput khanDTOInput = new KhanDTOInput("vaquar", "khan", "20", "E", null, "2222", "8308511500"); ClientConfig clientConfig = new DefaultClientConfig(); clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); Client client = Client.create(clientConfig); // // final HTTPBasicAuthFilter authFilter = new HTTPBasicAuthFilter(username, password); // client.addFilter(authFilter); // client.addFilter(new LoggingFilter()); // WebResource webResource = client .resource("http://vaquarkhan.net:12221/khanWeb/messages/sms/api/v1/userapi"); ClientResponse response = webResource.accept("application/json") .type("application/json").put(ClientResponse.class, khanDTOInput); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } String output = response.getEntity(String.class); System.out.println("Server response .... \n"); System.out.println(output); } catch (Exception e) { e.printStackTrace(); } } }