Khách hàng Jersey: Cách thêm danh sách làm tham số truy vấn


81

Tôi đang tạo một ứng dụng khách Jersey cho một dịch vụ GET có tham số Truy vấn Danh sách. Theo tài liệu , có thể có Danh sách làm tham số truy vấn (thông tin này cũng có tại @QueryParam javadoc), hãy kiểm tra:

Nói chung, kiểu Java của tham số phương thức có thể:

  1. Là một loại nguyên thủy;
  2. Có một hàm tạo chấp nhận một đối số Chuỗi đơn lẻ;
  3. Có một phương thức tĩnh có tên valueOf hoặc fromString chấp nhận một đối số Chuỗi (ví dụ: xem, ví dụ: Integer.valueOf (Chuỗi) và java.util.UUID.fromString (Chuỗi)); hoặc là
  4. Be List, Set hoặc SortedSet, trong đó T thỏa mãn 2 hoặc 3 ở trên. Bộ sưu tập kết quả là chỉ đọc.

Đôi khi các tham số có thể chứa nhiều hơn một giá trị cho cùng một tên. Nếu trường hợp này xảy ra thì các loại trong 4) có thể được sử dụng để lấy tất cả các giá trị.

Tuy nhiên, tôi không thể tìm ra cách thêm tham số truy vấn Danh sách bằng ứng dụng khách Jersey.

Tôi hiểu các giải pháp thay thế là:

  1. Sử dụng POST thay vì GET;
  2. Chuyển Danh sách thành một chuỗi JSON và chuyển nó đến dịch vụ.

Cách đầu tiên không tốt, vì động từ HTTP thích hợp cho dịch vụ là GET. Nó là một hoạt động truy xuất dữ liệu.

Lựa chọn thứ hai sẽ là lựa chọn của tôi nếu bạn không thể giúp tôi. :)

Tôi cũng đang phát triển dịch vụ, vì vậy tôi có thể thay đổi nó nếu cần.

Cảm ơn!

Cập nhật

Mã khách hàng (sử dụng 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>() {});

1
bạn có thể cho mã khách hàng jersey đây ...
Yogesh Prajapati

1
yogesh, tôi đã thêm mã khách hàng.
lsborg

2
Nếu tôi hiểu câu lệnh vấn đề của bạn, bạn có thể chuyển danh sách giá trị dưới dạng tham số Truy vấn bằng cách thêm nhiều giá trị vào cùng một khóa. Nếu "searchWrapper" là khóa và bạn muốn chuyển nhiều giá trị cho nó: hãy xây dựng URL như thế này: // YourURL? SearchWrapper = value1 & searchWrapper = value2 & searchWrapper = value3, có thể bạn cần chèn giá trị nhiều lần vào cùng một khóa nếu Bản đồ nhiều giá trị của bạn hỗ trợ nó .
Thamme Gowda

1
Cảm ơn, @ThammeGowda! Tôi chưa thử nghiệm nó nhưng có vẻ như nó thực hiện thủ thuật như javadoc MultivaluedMap để thêm trạng thái phương thức: Thêm giá trị vào danh sách giá trị hiện tại cho khóa được cung cấp .
lsborg

Câu trả lời:


116

@GET không hỗ trợ Danh sách các chuỗi

Thiết lập :
Java: 1.7
Phiên bản Jersey: 1.9

Nguồn

@Path("/v1/test")

Nguồn phụ :

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

Thử nghiệm Jersey

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

1
Cảm ơn bạn. Nó giúp tôi.
Sapikelio

60
Cũng giống như một lưu ý cho những người khác, nếu bạn đang viết URL trực tiếp trong trình duyệt, bạn phải lặp lại tên tham số: ..? List = one & list = two & list = three
endian

2
Đây có thực sự là một danh sách / thứ tự được đảm bảo sẽ được tôn trọng? Với nó có vẻ như đó là một bản đồ multivalued rằng Jersey lợi nhuận như một danh sách Tôi ngạc nhiên nếu có thể có vấn đề với trật tự không được bảo quản
hayduke

vâng. ? list = one & list = two & list = three không hữu ích. as list = one, two, three - đó là lý do tại sao tôi chuyển nó theo cách thủ công từ chuỗi này sang danh sách ..List<String> argList = List.of(argString.split("\\s*,\\s*"))
ses

30

Nếu bạn đang gửi bất kỳ thứ gì khác ngoài các chuỗi đơn giản, tôi khuyên bạn nên sử dụng POST với nội dung yêu cầu thích hợp hoặc chuyển toàn bộ danh sách dưới dạng chuỗi JSON được mã hóa thích hợp. Tuy nhiên, với các chuỗi đơn giản, bạn chỉ cần nối từng giá trị vào URL yêu cầu một cách thích hợp và Jersey sẽ giải mã cho bạn. Vì vậy, với điểm cuối ví dụ sau:

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

Khách hàng của bạn sẽ gửi một yêu cầu tương ứng với:

TẢI http://example.com/services/echo?list=Hello&list=Stay&list=Goodbye

Điều này sẽ dẫn đến inputListviệc bị deserialized để chứa các giá trị "Xin chào", "Ở lại" và "Tạm biệt"


2
Cảm ơn câu trả lời của bạn Perception! Nhưng tôi muốn tìm hiểu xem liệu có thể thực hiện GET với Danh sách dưới dạng tham số truy vấn bằng máy khách Jersey hay không.
lsborg

1
Bạn có thể vui lòng cho biết cách tạo danh sách như vậy ở phía máy khách không, vì khách hàng của tôi là android và ios. Rõ ràng chúng ta không muốn tạo key = value & key = giá trị manuall
Nilesh

nếu nó gửi list[0]=Hello&list[1]=Staythì sao? làm thế nào để quản lý điều đó?
user1735921

6

tôi đồng ý với bạn về các giải pháp thay thế mà bạn đã đề cập ở trên

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

và đúng là bạn không thể thêm Listvào MultiValuedMapvì lớp impl của nó MultivaluedMapImplcó khả năng chấp nhận Khóa chuỗi và Giá trị chuỗi. được hiển thị trong hình sau

nhập mô tả hình ảnh ở đây

bạn vẫn muốn làm những điều đó hơn là thử làm theo mã.

Lớp điều khiển

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

Lớp khách hàng

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

hy vọng điều này sẽ giúp bạn.


Câu trả lời hay nhất ở đây! Cảm ơn +1
Haramoz

3

NHẬN Yêu cầu với Tham số truy vấn 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();    
        }    
    }    
}

Yêu cầu Đăng:

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

        }    
    }    
}

xem ví dụ về tài nguyên Khách hàng là những gì tôi cần :) cảm ơn
Mobigital
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.