Jersey客户端:如何添加列表作为查询参数
我正在为具有列表作为查询参数的GET服务创build一个Jersey客户端。 根据文档 ,有可能有一个列表作为查询参数(这个信息也在@QueryParam javadoc),检查出来:
通常,方法参数的Javatypes可以:
- 是一个原始types;
- 有一个接受单个String参数的构造函数;
- 有一个名为valueOf或fromString的静态方法,它接受一个String参数(例如,参见Integer.valueOf(String)和java.util.UUID.fromString(String)); 要么
- 是List,Set或SortedSet,其中T满足2或3以上。 结果集合是只读的。
有时参数可能包含多个同名的值。 如果是这种情况,则可以使用4)中的types来获得所有值。
但是,我不知道如何使用Jersey客户端添加列表查询参数。
我了解替代解决scheme是:
- 使用POST而不是GET;
- 将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(); } } }