जर्सी क्लाइंट: क्वेरी पैरामीटर के रूप में एक सूची कैसे जोड़ें


81

मैं एक GET सेवा के लिए एक जर्सी क्लाइंट बना रहा हूं जिसमें क्वेरी पैरामीटर के रूप में एक सूची है। प्रलेखन के अनुसार , एक क्वेरी पैरामीटर के रूप में एक सूची होना संभव है (यह जानकारी @QueryParam javadoc पर भी है ), इसे देखें:

सामान्य तौर पर विधि पैरामीटर का जावा प्रकार निम्न हो सकता है:

  1. एक आदिम प्रकार हो;
  2. एक कंस्ट्रक्टर है जो एकल स्ट्रिंग तर्क को स्वीकार करता है;
  3. एक स्थिर विधि है जिसका नाम valueOf या fromString है जो एक एकल स्ट्रिंग तर्क स्वीकार करता है (उदाहरण के लिए देखें, Integer.valueOf (स्ट्रिंग) और java.util.UUID.fromString (स्ट्रिंग)); या
  4. सूची, सेट या सॉर्टसेट हो, जहां टी ऊपर 2 या 3 को संतुष्ट करता है। परिणामी संग्रह केवल पढ़ने के लिए है।

कभी-कभी मापदंडों में एक ही नाम के लिए एक से अधिक मूल्य हो सकते हैं। यदि यह स्थिति है तो सभी मान प्राप्त करने के लिए 4) प्रकारों का उपयोग किया जा सकता है।

हालाँकि, मैं यह पता नहीं लगा सकता कि जर्सी क्लाइंट का उपयोग करके सूची क्वेरी पैरामीटर कैसे जोड़ा जाए।

मैं समझता हूं कि वैकल्पिक समाधान हैं:

  1. GET के बजाय POST का उपयोग करें;
  2. सूची को 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>() {});

1
क्या आप यहां जर्सी ग्राहक कोड दे सकते हैं ...
योगेश प्रजापति

1
योगेश, मैंने क्लाइंट कोड जोड़ा।
lsborg

2
यदि मैं आपके समस्या कथन को समझता हूं, तो आप एक ही कुंजी में कई मान जोड़कर क्वेरी पैरामीटर के रूप में मानों की सूची पास कर सकते हैं। यदि "searchWrapper" कुंजी है और आप इसके लिए कई मान पास करना चाहते हैं: URL का निर्माण इस तरह करें: // YourURL? SearchWrapper = value1 & searchWrapper = value2 & searchWrapper = value3 आपको कई बार एक ही कुंजी में मान डालने की आवश्यकता हो सकती है यदि आपका MultivaluedMap इसका समर्थन करता है। ।
थम्मे गौड़ा

1
धन्यवाद, @ थम्मेगौड़ा! मैंने इसका परीक्षण नहीं किया है, लेकिन इसे जोड़ने की विधि राज्यों के लिए मल्टीवैलिडेपॉटर जेवाडॉक के रूप में चाल करने के लिए लगता है: आपूर्ति की गई कुंजी के लिए मूल्यों की वर्तमान सूची में एक मूल्य जोड़ें
17

जवाबों:


119

@GET स्ट्रिंग्स की सूची का समर्थन करता है

सेटअप :
जावा: 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();
}

जर्सी टेस्टकेस

@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
धन्यवाद। इससे मुझे मदद मिलती है।
सपिक्लियो

62
दूसरों के लिए एक नोट के रूप में, यदि आप सीधे ब्राउज़र में URL लिख रहे हैं, तो आपको पैरामीटर नाम दोहराना होगा: ..? सूची = एक और सूची = दो और सूची = तीन
एंडियन

2
क्या यह वास्तव में एक सूची है / सम्मान के लिए आदेश की गारंटी है? यह देखते हुए ऐसा लगता है कि यह एक बहुस्तरीय नक्शा है कि जर्सी एक सूची के रूप में लौटती है मुझे आश्चर्य है कि अगर कोई आदेश संरक्षित नहीं होने के साथ समस्या हो सकती है
hayduke

हाँ। ? सूची = एक और सूची = दो और सूची = तीन उपयोगी नहीं है। सूची के रूप में = एक, दो, तीन - यही कारण है कि मैं स्ट्रिंग से सूची में मैन्युअल रूप से इसे pares के ..List<String> argList = List.of(argString.split("\\s*,\\s*"))
Ses

30

यदि आप सरल तार के अलावा कुछ भी भेज रहे हैं, तो मैं एक उपयुक्त अनुरोध निकाय के साथ एक 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();
    }
}

आपका ग्राहक इसके लिए अनुरोध भेजेगा:

Http://example.com/services/echo?list=Hello&list=Stay&list=Goodbye प्राप्त करें

जिसके परिणामस्वरूप inputList'हैलो', 'स्टे' और 'अलविदा' मूल्यों को शामिल करने के लिए निराश होना चाहिए


2
आपके उत्तर के लिए धन्यवाद धारणा! लेकिन मुझे यह पता लगाना है कि क्या जर्सी क्लाइंट का उपयोग करके क्वेरी पैरामीटर के रूप में एक सूची के साथ जीईटी करना संभव है।
lsborg

1
क्या आप कृपया बता सकते हैं कि क्लाइंट साइड में ऐसी सूची कैसे बनाई जाए, क्योंकि मेरे ग्राहक एंड्रॉइड और आईओएस हैं। जाहिर है कि हम कुंजी = मान और कुंजी = मान मनुहार बनाना नहीं चाहते हैं
nilesh

क्या होगा अगर यह भेजता है list[0]=Hello&list[1]=Stay? कैसे प्रबंधित करें?
user1735921

6

मैं आपके साथ उन वैकल्पिक समाधानों के बारे में सहमत हूं, जिनका आपने ऊपर उल्लेख किया है

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

और इसके सही Listहोने के MultiValuedMapकारण आप इसे जोड़ नहीं सकते हैं , क्योंकि इसके निहित वर्ग MultivaluedMapImplमें स्ट्रिंग कुंजी और स्ट्रिंग मान को स्वीकार करने की क्षमता है। जिसे निम्नलिखित आकृति में दिखाया गया है

यहाँ छवि विवरण दर्ज करें

फिर भी आप कोड का पालन करने की तुलना में कोशिश करना चाहते हैं।

नियंत्रक वर्ग

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

ग्राहक वर्ग

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

आशा है कि यह आपकी मदद करेगा।


सबसे अच्छा जवाब यहाँ! धन्यवाद +1
हरमोज़

3

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

        }    
    }    
}

ग्राहक संसाधन का उदाहरण देखकर मुझे जो चाहिए था :) धन्यवाद
मोबिजिटल

0

कोई क्वेरीपराम विधि का उपयोग कर सकता है, इसे पैरामीटर नाम और मानों की एक पंक्ति से गुजारें:

    public WebTarget queryParam(String name, Object... values);

उदाहरण (जर्सी-क्लाइंट 2.23.2):

    WebTarget target = ClientBuilder.newClient().target(URI.create("http://localhost"));
    target.path("path")
            .queryParam("param_name", Arrays.asList("paramVal1", "paramVal2").toArray())
            .request().get();

यह निम्नलिखित URL के लिए अनुरोध जारी करेगा:

    http://localhost/path?param_name=paramVal1&param_name=paramVal2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.