Подтвердить что ты не робот

Клиент Джерси: как добавить список в качестве параметра запроса

Я создаю клиент Джерси для службы GET, у которой есть параметр List as query. Согласно documentation, возможно иметь список как параметр запроса (эта информация также находится в @QueryParam javadoc), проверьте:

В общем, тип Java параметра метода может:

  • Будьте примитивным типом;
  • У конструктора, который принимает один аргумент String,
  • Имейте статический метод с именем valueOf или fromString, который принимает единственный аргумент String (см., например, Integer.valueOf(String) и java.util.UUID.fromString(String)); или
  • Список, Set или SortedSet, где T удовлетворяет 2 или 3 выше. Полученная коллекция доступна только для чтения.

Иногда параметры могут содержать более одного значения для одного и того же имени. Если это так, то типы в 4) могут использоваться для получения всех значений.

Тем не менее, я не могу понять, как добавить параметр запроса List с помощью клиента Jersey.

Я понимаю альтернативные решения:

  • Используйте POST вместо GET;
  • Преобразовать список в строку 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>() {});
4b9b3361

Ответ 1

@GET поддерживает список строк

Настройка:
Java: 1.7
Джерси версия: 1.9

Ресурс

@Path("/v1/test")

Subresource

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

Ответ 2

Если вы отправляете что-либо другое, кроме простых строк, я бы рекомендовал использовать POST с соответствующим телом запроса или передать весь список как правильно закодированную строку JSON. Однако с помощью простых строк вам нужно просто добавить каждое значение в URL-адрес запроса, и Джерси десериализует его для вас. Поэтому дается следующий пример конечной точки:

@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"

Ответ 3

Я согласен с вами в отношении альтернативных решений, о которых вы упомянули выше.

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

и его истинность, что вы не можете добавить List в MultiValuedMap из-за своего класса impl MultivaluedMapImpl, могут принимать значения String Key и String Value. который показан на следующем рисунке

enter image description here

все же вы хотите сделать что-то, а не попробовать следующий код.

Класс контроллера

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

надеюсь, что это поможет вам.

Ответ 4

Запрос 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();

        }

    }

}