एंड्रॉइड में HTTP GET अनुरोध में पैरामीटर कैसे जोड़ें?


119

मेरा एक HTTP GET अनुरोध है जिसे मैं भेजने का प्रयास कर रहा हूं। मैंने पहले BasicHttpParamsऑब्जेक्ट बनाने और उस ऑब्जेक्ट में पैरामीटर जोड़ने के द्वारा इस अनुरोध में पैरामीटर जोड़ने की कोशिश की , फिर setParams( basicHttpParms )अपनी HttpGetवस्तु पर कॉल किया । यह विधि विफल हो जाती है। लेकिन अगर मैं अपने पैरामीटर को अपने URL (यानी परिशिष्ट ?param1=value1&param2=value2) में जोड़ देता हूं तो यह सफल हो जाता है।

मुझे पता है कि मैं यहाँ कुछ याद कर रहा हूँ और किसी भी मदद की बहुत सराहना की जाएगी।


1
GET अनुरोध के लिए, दूसरा तरीका पैरामीटर जोड़ने का सही तरीका है। मुझे उम्मीद है कि पहला दृष्टिकोण POST विधियों के लिए है।
जेम्स ब्लैक

जवाबों:


225

मैं URL स्ट्रिंग का नाम सूची का उपयोग करता हूं और URLEncodedUtils जो मैं चाहता हूं कि url स्ट्रिंग बनाने के लिए।

protected String addLocationToUrl(String url){
    if(!url.endsWith("?"))
        url += "?";

    List<NameValuePair> params = new LinkedList<NameValuePair>();

    if (lat != 0.0 && lon != 0.0){
        params.add(new BasicNameValuePair("lat", String.valueOf(lat)));
        params.add(new BasicNameValuePair("lon", String.valueOf(lon)));
    }

    if (address != null && address.getPostalCode() != null)
        params.add(new BasicNameValuePair("postalCode", address.getPostalCode()));
    if (address != null && address.getCountryCode() != null)
        params.add(new BasicNameValuePair("country",address.getCountryCode()));

    params.add(new BasicNameValuePair("user", agent.uniqueId));

    String paramString = URLEncodedUtils.format(params, "utf-8");

    url += paramString;
    return url;
}

मैं सहमत हूँ। मैं वापस चला गया हूं और इसे बदल दिया है क्योंकि यह विधि बड़ी मात्रा में मापदंडों के लिए समझ में आता है। पहला स्वीकृत जवाब अभी भी ठीक काम करता है, लेकिन मापदंडों के बड़े सेट के लिए भ्रमित हो सकता है।
ग्रूमी

@ ब्रायन ग्रिफ अच्छे समाधान के लिए धन्यवाद। लेकिन मेरे पास पैरामीटर पारित करने के लिए बहुत कम प्रारूप हैं, क्या कोई मुझे इस पैरामीटर को पारित करने में मदद कर सकता है ..? इस मामले में पैरामीटर कैसे पारित करें? data = '{"क्रेडेंशियल": {"accesToken": "668f514678c7e7f7e5e71a07044935d94c", "ACK": "cf3bbb969623a8e8fc032a08098d9f7b3"}, "In rest", "" "" "" "" "" "" ... "
योग गुरु

1
अन्य उत्तर सरल मामलों के लिए बहुत छोटा और सरल है। यह गलत नहीं है, और विचार करने लायक है।
qris

2
सूची <NameValuePair> Android api स्तर 22 में
चित्रित किया गया है

@SimonMeier: Uri.Builder () का उपयोग करें। नीचे उत्तर देखें।
विहान वर्मा

95

उरी को मापदंडों के साथ बनाने के लिए, Uri.Builder एक अधिक प्रभावी तरीका प्रदान करता है।

Uri uri = new Uri.Builder()
    .scheme("http")
    .authority("foo.com")
    .path("someservlet")
    .appendQueryParameter("param1", foo)
    .appendQueryParameter("param2", bar)
    .build();

इसके अलावा कैंट हैंडल फाइल पैरामीटर
siamii

@ bizso09 "फ़ाइल पैरामीटर" का मतलब क्या आप क्वेरी और टुकड़ा है? वे दोनों बिल्डर द्वारा व्यवस्थित हैं। URI शब्दावली के लिए इस पर एक नज़र डालें, इससे मुझे एक बहुत विकासकर्ता की
डीवीडी

क्वेरी पैरामीटर कैसे निकालें? मौजूदा क्वेरी पैरामीटर का मान कैसे बदलें?
पायोत्र

एक स्पष्ट तरीका है developer.android.com/reference/android/net/… । संशोधित करने के लिए, मान लें कि आपके पास प्रश्नों की एक सूची है, सूची में मूल्य को अपडेट करें, clearQuery () और फिर सूची के पाश में appendQueryParameter कॉल करें। लेकिन मांग पर हर बार नया क्यों नहीं बनाया?
9

31

HttpCompords के रूप में 4.2+एक नया वर्ग URIBuilder है , जो यूआरआई पैदा करने के लिए सुविधाजनक तरीका प्रदान करता है।

आप स्ट्रिंग URL से सीधे URI बना सकते हैं:

List<NameValuePair> listOfParameters = ...;

URI uri = new URIBuilder("http://example.com:8080/path/to/resource?mandatoryParam=someValue")
    .addParameter("firstParam", firstVal)
    .addParameter("secondParam", secondVal)
    .addParameters(listOfParameters)
    .build();

अन्यथा, आप सभी मापदंडों को स्पष्ट रूप से निर्दिष्ट कर सकते हैं:

URI uri = new URIBuilder()
    .setScheme("http")
    .setHost("example.com")
    .setPort(8080)
    .setPath("/path/to/resource")
    .addParameter("mandatoryParam", "someValue")
    .addParameter("firstParam", firstVal)
    .addParameter("secondParam", secondVal)
    .addParameters(listOfParameters)
    .build();

एक बार जब आप URIऑब्जेक्ट बना लेते हैं , तो आपको बस HttpGetऑब्जेक्ट बनाने और उसे करने की आवश्यकता होती है:

//create GET request
HttpGet httpGet = new HttpGet(uri);
//perform request
httpClient.execute(httpGet ...//additional parameters, handle response etc.

28

प्रक्रिया

setParams() 

पसंद

httpget.getParams().setParameter("http.socket.timeout", new Integer(5000));

केवल HttpProtocol पैरामीटर जोड़ता है।

HttpGet को निष्पादित करने के लिए आपको अपने मापदंडों को url में मैन्युअल रूप से जोड़ना चाहिए

HttpGet myGet = new HttpGet("http://foo.com/someservlet?param1=foo&param2=bar");

या पोस्ट अनुरोध का उपयोग करें प्राप्त और पोस्ट अनुरोधों के बीच का अंतर यहाँ समझाया गया है , यदि आप रुचि रखते हैं


1
आपके सहयोग के लिए धन्यवाद। मुझे लगा कि GET अनुरोधों में पैरामीटर जोड़ने का एक अधिक प्रभावी तरीका हो सकता है।
ग्रूमसी

8
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("param1","value1");

String query = URLEncodedUtils.format(params, "utf-8");

URI url = URIUtils.createURI(scheme, userInfo, authority, port, path, query, fragment); //can be null
HttpGet httpGet = new HttpGet(url);

URI javadoc

नोट: url = new URI(...)छोटी गाड़ी है


4
    HttpClient client = new DefaultHttpClient();

    Uri.Builder builder = Uri.parse(url).buildUpon();

    for (String name : params.keySet()) {
        builder.appendQueryParameter(name, params.get(name).toString());
    }

    url = builder.build().toString();
    HttpGet request = new HttpGet(url);
    HttpResponse response = client.execute(request);
    return EntityUtils.toString(response.getEntity(), "UTF-8");

0

यदि आपके पास निरंतर है तो URLमैं सरलीकृत http-request का उपयोग करने की सलाह देता हूं अपाचे http पर निर्मित ।

आप निम्नलिखित के रूप में अपने ग्राहक का निर्माण कर सकते हैं:

private filan static HttpRequest<YourResponseType> httpRequest = 
                   HttpRequestBuilder.createGet(yourUri,YourResponseType)
                   .build();

public void send(){
    ResponseHendler<YourResponseType> rh = 
         httpRequest.execute(param1, value1, param2, value2);

    handler.ifSuccess(this::whenSuccess).otherwise(this::whenNotSuccess);
}

public void whenSuccess(ResponseHendler<YourResponseType> rh){
     rh.ifHasContent(content -> // your code);
}

public void whenSuccess(ResponseHendler<YourResponseType> rh){
   LOGGER.error("Status code: " + rh.getStatusCode() + ", Error msg: " + rh.getErrorText());
}

नोट: आपकी प्रतिक्रिया में हेरफेर करने के लिए कई उपयोगी तरीके हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.