Android के साथ एक HTTP अनुरोध करें


352

मैंने हर जगह खोज की है लेकिन मुझे अपना जवाब नहीं मिला, क्या कोई सरल HTTP अनुरोध करने का कोई तरीका है? मैं अपनी वेबसाइट पर एक PHP पेज / स्क्रिप्ट का अनुरोध करना चाहता हूं, लेकिन मैं वेबपेज नहीं दिखाना चाहता हूं।

यदि संभव हो तो मैं इसे पृष्ठभूमि में भी करना चाहता हूं (एक ब्रॉडकास्टर में)


जवाबों:


477

अपडेट करें

यह बहुत पुराना उत्तर है। मैं निश्चित रूप से अपाचे के ग्राहक की सिफारिश नहीं करूंगा। इसके बजाय या तो उपयोग करें:

मूल उत्तर

सबसे पहले, नेटवर्क का उपयोग करने की अनुमति का अनुरोध करें, अपने घोषणापत्र में निम्नलिखित जोड़ें:

<uses-permission android:name="android.permission.INTERNET" />

फिर सबसे आसान तरीका है अपाचे http क्लाइंट का उपयोग करें जो कि एंड्रॉइड के साथ बंडल किया गया है:

    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response = httpclient.execute(new HttpGet(URL));
    StatusLine statusLine = response.getStatusLine();
    if(statusLine.getStatusCode() == HttpStatus.SC_OK){
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        response.getEntity().writeTo(out);
        String responseString = out.toString();
        out.close();
        //..more logic
    } else{
        //Closes the connection.
        response.getEntity().getContent().close();
        throw new IOException(statusLine.getReasonPhrase());
    }

यदि आप इसे अलग धागे पर चलाना चाहते हैं, तो मैं AsyncTask का विस्तार करने की सलाह दूंगा:

class RequestTask extends AsyncTask<String, String, String>{

    @Override
    protected String doInBackground(String... uri) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                responseString = out.toString();
                out.close();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            //TODO Handle problems..
        } catch (IOException e) {
            //TODO Handle problems..
        }
        return responseString;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        //Do anything with response..
    }
}

आप तब एक अनुरोध कर सकते हैं:

   new RequestTask().execute("http://stackoverflow.com");

11
यहाँ AsyncTask पर आधिकारिक Android डेवलपर ब्लॉग का एक लेख दिया गया है: android-developers.blogspot.com/2010/07/…
महोनी

77
जिंजरब्रेड या अधिक से अधिक वास्तव में अपाचे पुस्तकालय पर HttpURLConnection का उपयोग करने की सलाह दी, देखें android-developers.blogspot.com/2011/09/… । बैटरी पर इसकी कम चुंगी और बेहतर प्रदर्शन
मार्टी

8
responseString = out.toString () out.close () कॉल से पहले होना चाहिए। वास्तव में, आपके पास अंततः एक ब्लॉक में आउट.क्लोज () होना चाहिए। लेकिन कुल मिलाकर, बहुत उपयोगी उत्तर (+1), धन्यवाद!
'15

9
हनीकॉम्ब (एसडीके 11) के रूप में अतुल्यकालिक दृष्टिकोण जाने का रास्ता है। जब आप मुख्य थ्रेड से HTTP अनुरोध को चलाने का प्रयास करते हैं तो एक NetworkOnMainThreadException फेंक दी जाती है।
msrxthr

2
यह उत्तर काफी उत्कृष्ट है। लेकिन मैं सलाह दूंगा कि नेटवर्किंग के लिए AsyncTasks का उपयोग न करें। वे मेमोरी लीक को बहुत आसानी से बना सकते हैं (और वास्तव में प्रदान किया गया उदाहरण लीक करता है), और सभी सुविधाओं को प्रदान न करें जो नेटवर्क अनुरोधों के लिए उम्मीद कर सकते हैं। इस तरह के पृष्ठभूमि कार्यों के लिए रोबोस्पाइस का उपयोग करने पर विचार करें: github.com/octo-online/robospice
Snicolas

67

जब तक आपके पास Apache HttpClient को चुनने का कोई स्पष्ट कारण नहीं है, तब तक आपको java.net.URLConnection पसंद करना चाहिए। आप वेब पर इसका उपयोग करने के कई उदाहरण पा सकते हैं।

हमने आपकी मूल पोस्ट के बाद से एंड्रॉइड डॉक्यूमेंटेशन में भी सुधार किया है: http://developer.android.com/reference/java/net/HttpURLConnection.html

और हमने आधिकारिक ब्लॉग पर ट्रेड-ऑफ़ के बारे में बात की है: http://android-developers.blogspot.com/2011/09/androids-http-clients.html


13
Apache HttpClient का उपयोग क्यों अनुशंसित नहीं है?
टेड

4
आधिकारिक ब्लॉग पर मेरा एक सह-साजिशकर्ता इस पर विस्तार से आया: android-developers.blogspot.com/2011/09/…
इलियट ह्यूजेस

@ इलियटहुग्स: मैं 100% सहमत हूं। इस बात से कोई इंकार नहीं है कि अपाचे httpclient आसान तरीके और प्रोटोकॉल का अधिक सारगर्भित दृश्य प्रस्तुत करता है, लेकिन जावा का मूल उत्थान किसी भी तरह से कम उपयोगी नहीं है। हाथों से थोड़ा सा, अपने हाथों से httpclient के रूप में उपयोग करना आसान है, और अधिक पोर्टेबल है
नितिन बंसल

1
दरअसल अगर आप वीडियो Google I / O 2010 पर नज़र डालें - Android REST क्लाइंट एप्लिकेशन ( youtube.com/watch?v=xHXn3Kg2IQE 57min21sec) तो आप देखेंगे कि Apache HttpClient यह सबसे अनुशंसित है। मैं Virgil Dobjanschi (Google पर एक सॉफ्टवेयर इंजीनियर जो एंड्रॉइड एप्लिकेशन ग्रुप पर काम करता है) को उद्धृत करता हूं "" मैं बस सलाह दूंगा कि आप HTTP अपाचे क्लाइंट का उपयोग करें, क्योंकि इसका अधिक मजबूत कार्यान्वयन है। HTTP लेनदेन का URL कनेक्शन प्रकार सबसे कुशल नहीं है कार्यान्वयन। और कभी-कभी कनेक्शन समाप्त करने के तरीके से नेटवर्क पर प्रतिकूल प्रभाव पड़ सकता है। "
एलन

46

नोट: Android के साथ बंडल अपाचे HTTP क्लाइंट अब HttpURLConnection के पक्ष में हटा दिया गया है । अधिक जानकारी के लिए कृपया Android Developers ब्लॉग देखें।

<uses-permission android:name="android.permission.INTERNET" />अपने प्रकट में जोड़ें ।

फिर आप एक वेब पेज पुनः प्राप्त करेंगे जैसे:

URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
     InputStream in = new BufferedInputStream(urlConnection.getInputStream());
     readStream(in);
}
finally {
     urlConnection.disconnect();
}

मैं इसे एक अलग धागे पर चलाने का सुझाव भी देता हूं:

class RequestTask extends AsyncTask<String, String, String>{

@Override
protected String doInBackground(String... uri) {
    String responseString = null;
    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        if(conn.getResponseCode() == HttpsURLConnection.HTTP_OK){
            // Do normal input or output stream reading
        }
        else {
            response = "FAILED"; // See documentation for more info on response handling
        }
    } catch (ClientProtocolException e) {
        //TODO Handle problems..
    } catch (IOException e) {
        //TODO Handle problems..
    }
    return responseString;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    //Do anything with response..
}
}

प्रतिक्रिया हैंडलिंग और POST अनुरोधों के बारे में अधिक जानकारी के लिए दस्तावेज़ देखें ।


1
@Semmix ऐसा कैसे? प्रश्न "एक सरल HTTP" अनुरोध के लिए पूछा गया था, और मेरा कोड बिल्कुल यही करता है।
kevinc

1
मुझे लगता है कि आपका पहला कोड ब्लॉक एंड्रॉइड डॉक्स से कॉपी किया गया है, लेकिन आदमी वह नमूना / डॉक्टर कचरा है। readStreamपरिभाषित भी नहीं है।
यूजीन के

@EugeneK वे हैं, लेकिन यह शायद इस सवाल का जवाब देने का सबसे सरल तरीका है। एंड्रॉइड में ठीक से HTTP रिक्वेस्ट करने से रेट्रोफिट, और ओक्हेट्प की व्याख्या करना शामिल होगा। मुझे लगता है कि शुरुआती लोगों को भ्रमित करने से ज्यादा सिर्फ एक स्निपेट सौंपना होगा जो तकनीकी रूप से एक साधारण HTTP अनुरोध करेगा, भले ही इसका निर्माण खराब तरीके से किया गया हो।
kevinc

12

सबसे सरल तरीका एंड्रॉइड लीब को वॉली कहा जाता है

वॉली निम्नलिखित लाभ प्रदान करता है:

नेटवर्क अनुरोधों का स्वत: निर्धारण। एकाधिक समवर्ती नेटवर्क कनेक्शन । मानक HTTP कैश सुसंगतता के साथ पारदर्शी डिस्क और मेमोरी प्रतिक्रिया कैशिंग। अनुरोध प्राथमिकता के लिए समर्थन। रद्दीकरण अनुरोध एपीआई। आप एक अनुरोध को रद्द कर सकते हैं, या आप रद्द करने के लिए अनुरोधों के ब्लॉक या स्कोप सेट कर सकते हैं। अनुकूलन में आसानी, उदाहरण के लिए, रिट्री और बैकऑफ़ के लिए। मजबूत ऑर्डरिंग जो आपके UI को नेटवर्क से अतुल्यकालिक रूप से प्राप्त किए गए डेटा के साथ सही ढंग से पॉप्युलेट करना आसान बनाता है। डिबगिंग और अनुरेखण उपकरण।

आप इसे सरल रूप से http / https अनुरोध भेज सकते हैं:

        // Instantiate the RequestQueue.
        RequestQueue queue = Volley.newRequestQueue(this);
        String url ="http://www.yourapi.com";
        JsonObjectRequest request = new JsonObjectRequest(url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    if (null != response) {
                         try {
                             //handle your response
                         } catch (JSONException e) {
                             e.printStackTrace();
                         }
                    }
                }
            }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        queue.add(request);

इस मामले में, आपको "पृष्ठभूमि में चलने" या "कैश का उपयोग करने" पर विचार करने की आवश्यकता नहीं है क्योंकि ये सभी पहले से ही वॉली द्वारा किए गए हैं।


6
private String getToServer(String service) throws IOException {
    HttpGet httpget = new HttpGet(service);
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    return new DefaultHttpClient().execute(httpget, responseHandler);

}

सादर


4

एक धागे के साथ:

private class LoadingThread extends Thread {
    Handler handler;

    LoadingThread(Handler h) {
        handler = h;
    }
    @Override
    public void run() {
        Message m = handler.obtainMessage();
        try {
            BufferedReader in = 
                new BufferedReader(new InputStreamReader(url.openStream()));
            String page = "";
            String inLine;

            while ((inLine = in.readLine()) != null) {
                page += inLine;
            }

            in.close();
            Bundle b = new Bundle();
            b.putString("result", page);
            m.setData(b);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        handler.sendMessage(m);
    }
}

4

मैंने URL पर अनुरोध करने के लिए एक वेबसन सेवा के लिए इसे बनाया, एक Gson lib का उपयोग करते हुए:

ग्राहक:

public EstabelecimentoList getListaEstabelecimentoPorPromocao(){

        EstabelecimentoList estabelecimentoList  = new EstabelecimentoList();
        try{
            URL url = new URL("http://" +  Conexao.getSERVIDOR()+ "/cardapio.online/rest/recursos/busca_estabelecimento_promocao_android");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();

            if (con.getResponseCode() != 200) {
                    throw new RuntimeException("HTTP error code : "+ con.getResponseCode());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader((con.getInputStream())));
            estabelecimentoList = new Gson().fromJson(br, EstabelecimentoList.class);
            con.disconnect();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return estabelecimentoList;
}

4

इस भयानक नई लाइब्रेरी को देखें जो कि ग्रेडल के माध्यम से उपलब्ध है :)

build.gradle: compile 'com.apptakk.http_request:http-request:0.1.2'

उपयोग:

new HttpRequestTask(
    new HttpRequest("http://httpbin.org/post", HttpRequest.POST, "{ \"some\": \"data\" }"),
    new HttpRequest.Handler() {
      @Override
      public void response(HttpResponse response) {
        if (response.code == 200) {
          Log.d(this.getClass().toString(), "Request successful!");
        } else {
          Log.e(this.getClass().toString(), "Request unsuccessful: " + response);
        }
      }
    }).execute();

https://github.com/erf/http-request


1
हर दूसरे पुस्तकालय की तरह लगता है ...
निक गैलिमोर

3

ऊपर बताए अनुसार वॉली का उपयोग करें। Build.gradle (मॉड्यूल: एप्लिकेशन) में निम्नलिखित जोड़ें

implementation 'com.android.volley:volley:1.1.1'

AndroidManifest.xml में निम्नलिखित जोड़ें:

<uses-permission android:name="android.permission.INTERNET" />

और आपके लिए निम्नलिखित गतिविधि कोड जोड़ें:

public void httpCall(String url) {

    RequestQueue queue = Volley.newRequestQueue(this);

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // enjoy your response
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // enjoy your error status
                }
    });

    queue.add(stringRequest);
}

यह http क्लाइंट को प्रतिस्थापित करता है और यह बहुत सरल है।


2

यह Android में HTTP Get / POST के लिए नया कोड है। HTTPClientवंचित है और उपलब्ध नहीं हो सकता क्योंकि यह मेरे मामले में था।

सबसे पहले build.gradle में दो निर्भरताएँ जोड़ें:

compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'

फिर इस कोड ASyncTaskको doBackgroundविधि में लिखें ।

 URL url = new URL("http://localhost:8080/web/get?key=value");
 HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
 urlConnection.setRequestMethod("GET");
 int statusCode = urlConnection.getResponseCode();
 if (statusCode ==  200) {
      InputStream it = new BufferedInputStream(urlConnection.getInputStream());
      InputStreamReader read = new InputStreamReader(it);
      BufferedReader buff = new BufferedReader(read);
      StringBuilder dta = new StringBuilder();
      String chunks ;
      while((chunks = buff.readLine()) != null)
      {
         dta.append(chunks);
      }
 }
 else
 {
     //Handle else
 }

कोड अपदस्थ हो सकता है और Apache Android प्लेटफ़ॉर्म API 28 में समर्थित नहीं है। उस स्थिति में, आप Apache विरासत संपत्ति को Manifest या मॉड्यूल स्तर ग्रेड फ़ाइल में सक्षम कर सकते हैं। हालाँकि, OKHttp, Volley या Retrofit नेटवर्किंग लाइब्रेरी का उपयोग करने की अनुशंसा की जाती है।
राहुल रैना

1

मेरे लिए, सबसे आसान तरीका लाइब्रेरी का उपयोग कर रहा है जिसे रेट्रोफिट 2 कहा जाता है

हमें बस एक इंटरफ़ेस बनाने की ज़रूरत है जिसमें हमारी अनुरोध विधि, पैरामीटर हों, और हम प्रत्येक अनुरोध के लिए कस्टम हेडर भी बना सकते हैं:

    public interface MyService {

      @GET("users/{user}/repos")
      Call<List<Repo>> listRepos(@Path("user") String user);

      @GET("user")
      Call<UserDetails> getUserDetails(@Header("Authorization") String   credentials);

      @POST("users/new")
      Call<User> createUser(@Body User user);

      @FormUrlEncoded
      @POST("user/edit")
      Call<User> updateUser(@Field("first_name") String first, 
                            @Field("last_name") String last);

      @Multipart
      @PUT("user/photo")
      Call<User> updateUser(@Part("photo") RequestBody photo, 
                            @Part("description") RequestBody description);

      @Headers({
        "Accept: application/vnd.github.v3.full+json",
        "User-Agent: Retrofit-Sample-App"
      })
      @GET("users/{username}")
      Call<User> getUser(@Path("username") String username);    

    }

और सबसे अच्छा है, हम इसे एसिंक्रोनस तरीके से एनक्यू विधि का उपयोग करके आसानी से कर सकते हैं


1

जैसा कि किसी भी उत्तर ने OkHttp के साथ अनुरोध करने का एक तरीका नहीं बताया , जो आजकल एंड्रॉइड और जावा के लिए सामान्य रूप से बहुत लोकप्रिय http क्लाइंट है, मैं एक सरल उदाहरण प्रदान करने जा रहा हूं:

//get an instance of the client
OkHttpClient client = new OkHttpClient();

//add parameters
HttpUrl.Builder urlBuilder = HttpUrl.parse("https://www.example.com").newBuilder();
urlBuilder.addQueryParameter("query", "stack-overflow");


String url = urlBuilder.build().toString();

//build the request
Request request = new Request.Builder().url(url).build();

//execute
Response response = client.newCall(request).execute();

इस पुस्तकालय का स्पष्ट लाभ यह है कि यह हमें कुछ निम्न स्तर के विवरणों से अलग करता है, उनके साथ बातचीत करने के लिए अधिक अनुकूल और सुरक्षित तरीके प्रदान करता है। वाक्यविन्यास भी सरल है और अच्छा कोड लिखने की अनुमति देता है।

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