Client Jersey: comment append une liste en tant que paramètre de requête

Je crée un client Jersey pour un service GET doté d’un paramètre List en tant que requête. Selon la documentation , il est possible d’avoir une liste en tant que paramètre de requête (cette information se trouve également dans @QueryParam javadoc), consultez-la:

En général, le type Java du paramètre de méthode peut:

  1. Être un type primitif;
  2. Avoir un constructeur qui accepte un seul argument Ssortingng;
  3. Avoir une méthode statique nommée valueOf ou fromSsortingng qui accepte un seul argument Ssortingng (voir, par exemple, Integer.valueOf (Ssortingng) et java.util.UUID.fromSsortingng (Ssortingng)); ou
  4. Soyez List, Set ou SortedSet, où T satisfait 2 ou 3 ci-dessus. La collection résultante est en lecture seule.

Parfois, les parameters peuvent contenir plusieurs valeurs pour le même nom. Si tel est le cas, tapez 4) peut être utilisé pour obtenir toutes les valeurs.

Cependant, je n’arrive pas à comprendre comment append un paramètre de requête List à l’aide du client Jersey.

Je comprends que les solutions alternatives sont:

  1. Utilisez POST au lieu de GET;
  2. Transformez la liste en chaîne JSON et transmettez-la au service.

Le premier n’est pas bon, car le verbe HTTP correct pour le service est GET. C’est une opération de récupération de données.

Le second sera mon option si vous ne pouvez pas m’aider. 🙂

Je développe également le service, donc je peux le changer si nécessaire.

Merci!

Mettre à jour

Code client (en utilisant json)

Client client = Client.create(); WebResource webResource = client.resource(uri.toSsortingng()); SearchWrapper sw = new SearchWrapper(termo, pagina, ordenacao, hits, SEARCH_VIEW, navegadores); MultivaluedMap 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() {}); 

@GET supporte la liste des chaînes

Configuration :
Java: 1.7
Version Jersey: 1.9

Ressource

 @Path("/v1/test") 

Subresource :

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

Testcase Jersey

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

Si vous envoyez autre chose que des chaînes simples, je vous recommande d’utiliser un POST avec un corps de requête approprié ou de transmettre la liste entière sous la forme d’une chaîne JSON correctement codée. Cependant, avec des chaînes simples, il vous suffit d’append chaque valeur à l’URL de la demande et Jersey le désérialisera pour vous. Donc, étant donné l’exemple de noeud final suivant:

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

Votre client enverrait une demande correspondant à:

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

Ce qui entraînerait la désérialisation de inputList pour contenir les valeurs “Hello”, “Stay” et “Goodbye”

Je suis d’accord avec vous sur les solutions alternatives que vous avez mentionnées ci-dessus

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

et c’est vrai que vous ne pouvez pas append List à MultiValuedMap raison de sa classe implicite, MultivaluedMapImpl a la capacité d’accepter la valeur de chaîne et de chaîne. qui est montré dans la figure suivante

entrer la description de l'image ici

vous voulez quand même faire les choses que d’essayer de suivre le code.

Classe de contrôleur

 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 Ssortingng save( @QueryParam("list") List list) { return new Gson().toJson(list) ; } } 

Classe 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(Ssortingng[] args) { Ssortingng op = doGet("http://localhost:8080/JerseyTest/rest/test/testMethod"); System.out.println(op); } private static Ssortingng doGet(Ssortingng url){ List list = new ArrayList(); list = Arrays.asList(new Ssortingng[]{"ssortingng1,ssortingng2,ssortingng3"}); MultivaluedMap params = new MultivaluedMapImpl(); Ssortingng lst = (list.toSsortingng()).subssortingng(1, list.toSsortingng().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); Ssortingng en = response.getEntity(Ssortingng.class); return en; } } 

J’espère que cela vous aidera.

Demande GET avec le paramètre de requête 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(Ssortingng[] args) { try { Ssortingng 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()); } */ Ssortingng output = webResource.path("/msg/sms").queryParam("search","{\"name\":\"vaquar\",\"surname\":\"khan\",\"ext\":\"2020\",\"age\":\"34\""}").get(Ssortingng.class); //Ssortingng output = response.getEntity(Ssortingng.class); System.out.println("Output from Server .... \n"); System.out.println(output); // } catch (Exception e) { e.printStackTrace(); } } } 

Post Request:

 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(Ssortingng[] 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()); } Ssortingng output = response.getEntity(Ssortingng.class); System.out.println("Server response .... \n"); System.out.println(output); } catch (Exception e) { e.printStackTrace(); } } }