Jersey client: comment ajouter une liste comme paramètre de requête

je crée un client Jersey pour un service GET qui a une liste comme paramètre de requête. Selon la documentation , il est possible d'avoir une liste comme paramètre de requête (cette information est aussi à @QueryParam javadoc), vérifier:

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

  1. soit un type primitif;
  2. ont un constructeur qui accepte un argument de chaîne simple;
  3. ont une méthode statique appelée valueOf ou fromString qui accepte un argument de chaîne simple (Voir, par exemple, entier.valueOf (String) et java.util.UUID.fromString (String)); ou
  4. Liste de, Ensemble ou SortedSet, où T satisfait à 2 ou 3 ci-dessus. La collection résultante est en lecture seule.

parfois, les paramètres peuvent contenir plus d'une valeur pour le même nom. Si tel est le cas, les types 4) peuvent être utilisés pour obtenir toutes les valeurs.

cependant, je ne peux pas comprendre comment ajouter un paramètre de requête de liste en utilisant le client Jersey.

je comprends que les solutions alternatives sont:

  1. Utiliser POST au lieu de GET;
  2. transforme la liste en chaîne JSON et passe-la au service.

Le premier n'est pas bon, parce que le verbe HTTP approprié 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 aussi le service, donc je peux le changer au besoin.

Merci!

mise à Jour

code Client (utilisant 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>() {});
65
demandé sur Patrick M 2012-12-06 22:20:39

4 réponses

@GET prend en charge la Liste de Chaînes

Setup :

Java: 1.7

Version de Jersey: 1.9

Ressource

@Path("/v1/test")

sous-ressource :

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

Maillot de cas de test

@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());
}
91
répondu Dharmi 2016-02-01 14:47:44

si vous envoyez autre chose que des chaînes simples, je vous recommande d'utiliser un message avec un corps de requête approprié, ou de passer la liste entière comme une chaîne JSON correctement encodée. Cependant, avec des chaînes simples, vous avez juste besoin d'ajouter chaque valeur à L'URL de la requête de manière appropriée et Jersey le deserialisera pour vous. Ainsi, compte tenu de l'exemple suivant:

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

votre client enverrait une demande correspondant à:

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

, ce qui aurait pour résultat de désérialiser inputList pour contenir les valeurs "Hello", "Stay" et "Goodbye"

26
répondu Perception 2012-12-07 14:40:46

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 string and pass it to the service.

et son vrai que vous ne pouvez pas ajouter List à MultiValuedMap en raison de sa classe impl MultivaluedMapImpl ont la capacité d'accepter la clé de chaîne et la valeur de chaîne. qui est montré dans la figure suivante

enter image description here

vous voulez toujours faire ces choses que d'essayer de suivre le code.

Classe 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 String save(
               @QueryParam("list") List<String> list) {

           return  new Gson().toJson(list) ;
       }
}

Cleint Classe

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;
    }
}

j'espère que ça vous aidera.

4
répondu Yogesh Prajapati 2012-12-08 05:05:20

Requête GET avec JSON Requête Param

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

Requête Post :

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

        }    
    }    
}
1
répondu vaquar khan 2018-09-14 05:09:59