অ্যান্ড্রয়েড দিয়ে একটি HTTP অনুরোধ করুন


353

আমি সর্বত্র অনুসন্ধান করেছি কিন্তু আমি আমার উত্তর খুঁজে পাইনি, একটি সাধারণ এইচটিটিপি অনুরোধ করার কোনও উপায় আছে কি? আমি আমার ওয়েবসাইটের একটিতে পিএইচপি পৃষ্ঠা / স্ক্রিপ্টের জন্য অনুরোধ করতে চাই তবে আমি ওয়েবপৃষ্ঠাটি দেখাতে চাই না।

সম্ভব হলে আমি এটি ব্যাকগ্রাউন্ডেও করতে চাই (একটি ব্রডকাস্টারসিভারে)


উত্তর:


478

হালনাগাদ

এটি একটি খুব পুরানো উত্তর। আমি স্পষ্টতই আর অ্যাপাচি-র ক্লায়েন্টকে প্রস্তাব দেব না। পরিবর্তে হয় ব্যবহার করুন:

আসল উত্তর

প্রথমত, নেটওয়ার্ক অ্যাক্সেসের জন্য অনুমতিটির অনুরোধ করুন, আপনার ম্যানিফেস্টে নিম্নলিখিতটি যুক্ত করুন:

<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/...
Austyn Mahoney

77
জিনজার ব্রেড বা তার অধিক তার আসলে Apache গ্রন্থাগার উপর HttpURLConnection ব্যবহার করার দেখতে পরামর্শ দেওয়া android-developers.blogspot.com/2011/09/... । এটি ব্যাটারির উপর কম কর এবং এর আরও ভাল পারফরম্যান্স রয়েছে
মার্টি

8
প্রতিক্রিয়া স্ট্রিং = আউট.টোস্ট্রিং () আউটক্লক () কল করার আগে হওয়া দরকার। আসলে, আপনার সম্ভবত শেষ অবধি ব্লক (আউটক্লোজ) করা উচিত। তবে সামগ্রিকভাবে, খুব সহায়ক উত্তর (+1), ধন্যবাদ!
ডিসিপি

9
মধুচক্র হিসাবে (এসডিকে 11) অ্যাসিনক্রোনাস পদ্ধতির উপায়। আপনি যখন মূল থ্রেড থেকে এইচটিটিপি অনুরোধ চালানোর চেষ্টা করবেন তখন একটি নেটওয়ার্কঅনমেনথ্রেডএক্সেপশন নিক্ষেপ হয়ে যায়।
MSrxthr

2
এই উত্তরটি বেশ দুর্দান্ত। তবে আমি নেটওয়ার্কিংয়ের জন্য অ্যাসিঙ্কটাস্ক ব্যবহার না করার পরামর্শ দেব। তারা খুব সহজেই মেমরি ফাঁস তৈরি করতে পারে (এবং প্রকৃতপক্ষে সরবরাহিত উদাহরণটি ফাঁস করে) এবং নেটওয়ার্ক অনুরোধগুলির জন্য আশা করা সমস্ত বৈশিষ্ট্য সরবরাহ করে না। এই জাতীয় ব্যাকগ্রাউন্ড টাস্কগুলির জন্য রোবস্পাইস ব্যবহার বিবেচনা করুন: github.com/octo-online/robospice
Snicolas

67

যদি আপনার কাছে অ্যাপাচি এইচটিপিপিলেটটি বেছে নেওয়ার স্পষ্ট কারণ না থাকে তবে আপনার java.net.URL সংযোগটি পছন্দ করা উচিত। এটি ওয়েবে কীভাবে ব্যবহার করতে হয় তার প্রচুর উদাহরণ পেতে পারেন।

আমরা আপনার মূল পোস্টের পর থেকে অ্যান্ড্রয়েড ডকুমেন্টেশনটিও উন্নত করেছি: http://developer.android.com/references/java/net/HttpURLConnication.html

এবং আমরা অফিশিয়াল ব্লগে ট্রেড-অফগুলির বিষয়ে কথা বলেছি: http://android-developers.blogspot.com/2011/09/androids-http-clients.html


13
কেন অ্যাপাচি এইচটিপিপিলেট ব্যবহারের প্রস্তাব দেওয়া হচ্ছে না?
টেড

4
আমার একজন সহ-ষড়যন্ত্রকারী অফিসিয়াল ব্লগে এ সম্পর্কে বিস্তৃতভাবে আলোচনা করেছে
এলিয়ট হিউজেস

@ এলিয়ট হিউজেস: আমি 100% এর সাথে সম্মত। অস্বীকার করার কোনও দরকার নেই যে অ্যাপাচি httpclient সহজ পদ্ধতি এবং প্রোটোকলের আরও বিমূর্ত দৃষ্টিভঙ্গি সরবরাহ করে, তবে জাভার নেটিভ urlconnication কোনওভাবেই কার্যকর নয়। কিছুটা হাত দিয়ে, এটি httpclient হিসাবে ব্যবহার করা যেমন সহজ, তেমনি আরও বহনযোগ্য
নিতিন বানসাল

1
আসলে আপনি যদি ভিডিও গুগল আই / ও ২০১০ - অ্যান্ড্রয়েড আরএসটি ক্লায়েন্ট অ্যাপ্লিকেশনগুলি ( youtube.com/watch?v=xHXn3Kg2IQE 57min21sec) দেখুন তবে আপনি দেখতে পাবে যে অ্যাপাচি এইচটিপিপিপ্লায়েন্ট এটিই সবচেয়ে প্রস্তাবিত। আমি ভার্জিল ডবজানসিকে (গুগলের একটি সফটওয়্যার ইঞ্জিনিয়ার যা অ্যান্ড্রয়েড অ্যাপ্লিকেশন গ্রুপে কাজ করে) উদ্ধৃতি দিয়েছি "আমি কেবলমাত্র আপনাকে এইচটিটিপি অ্যাপাচি ক্লায়েন্ট ব্যবহার করার পরামর্শ দিচ্ছি কারণ এটির আরও দৃ implementation় বাস্তবায়ন রয়েছে। এইচটিটিপি লেনদেনের URL সংযোগের ধরনটি সবচেয়ে কার্যকর নয় বাস্তবায়ন.আর কখনও কখনও সংযোগগুলি যেভাবে বন্ধ করে দেয় তা নেটওয়ার্কে বিরূপ প্রভাব ফেলতে পারে। "
অ্যালান

46

দ্রষ্টব্য: অ্যান্ড্রয়েডের সাথে বান্ডিল হওয়া অ্যাপাচি এইচটিটিপি ক্লায়েন্টটি এখন এইচটিপিআরএল সংযোগের পক্ষে অবনতিযুক্ত । আরও তথ্যের জন্য দয়া করে অ্যান্ড্রয়েড বিকাশকারী ব্লগ দেখুন।

যোগ <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..
}
}

প্রতিক্রিয়া পরিচালনা ও পোষ্ট অনুরোধ সম্পর্কিত আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন ।


1
@ সিমমিক্স কীভাবে? প্রশ্নটি "একটি সাধারণ এইচটিটিপি" অনুরোধের জন্য জিজ্ঞাসা করেছিল, এবং আমার কোডটি ঠিক এটি করে।
কেভিঙ্ক

1
আমি পেয়েছি যে আপনার প্রথম কোড ব্লকটি অ্যান্ড্রয়েড ডক্স থেকে অনুলিপি করা হয়েছে তবে মানুষ সেই নমুনা / ডক আবর্জনা। readStreamএমনকি সংজ্ঞায়িত করা হয় না।
ইউজিন কে

@ ইউজেনেক তারা, তবে সম্ভবত এই প্রশ্নের উত্তর দেওয়ার সবচেয়ে সহজ উপায়। অ্যান্ড্রয়েডে সঠিকভাবে একটি এইচটিটিপি অনুরোধ করাতে retrofit এবং OkHttp ব্যাখ্যা করা জড়িত। আমি মনে করি যে এটি প্রাথমিকভাবে একটি স্নিপেট প্রদানের চেয়ে আরও বিভ্রান্ত করবে যা প্রযুক্তিগতভাবে একটি সাধারণ এইচটিটিপি অনুরোধ করবে, যদিও এটি খারাপভাবে নির্মিত না হলেও।
কেভিঙ্ক

12

সবচেয়ে সহজ উপায় হ'ল ভল্লি নামক অ্যান্ড্রয়েড লিব ব্যবহার করা using

ভলি নিম্নলিখিত সুবিধা দেয়:

নেটওয়ার্ক অনুরোধগুলির স্বয়ংক্রিয় সময় নির্ধারণ। একাধিক সমবর্তী নেটওয়ার্ক সংযোগ । স্বচ্ছ ডিস্ক এবং মেমরি জবাব স্ট্যান্ডার্ড এইচটিটিপি ক্যাশে সঙ্গতি সহ ক্যাচিং। অনুরোধ অগ্রাধিকার জন্য সমর্থন। বাতিলকরণের অনুরোধ এপিআই। আপনি একটি একক অনুরোধ বাতিল করতে পারেন, বা আপনি বাতিল করতে অনুরোধগুলির ব্লক বা স্কোপ সেট করতে পারেন। স্বনির্ধারণের সহজতা, উদাহরণস্বরূপ, পুনরায় চেষ্টা এবং ব্যাকঅফের জন্য। শক্তিশালী ক্রম যা আপনার ইউআইটিকে ডেটাটি নেটওয়ার্ক থেকে অ্যাসিঙ্ক্রোনালি আনার সাথে সঠিকভাবে পপ করা সহজ করে তোলে। ডিবাগিং এবং ট্রেসিং সরঞ্জামগুলি।

আপনি এর চেয়ে সহজ কোনও 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

আমি একটি জিএসএন লাইব ব্যবহার করে ইউআরএল-এ সংযোগ দেওয়ার জন্য একটি ওয়েব পরিষেবাটি তৈরি করার জন্য এটি তৈরি করেছি:

ক্লায়েন্ট:

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'

অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে নিম্নলিখিতগুলি যুক্ত করুন:

<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

অ্যান্ড্রয়েডে এইচটিটিপি গেট / পোস্ট অনুরোধের জন্য এটিই নতুন কোড। 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
 }

কোডটি অবহেলিত হতে পারে এবং অ্যাপাড অ্যান্ড্রয়েড প্ল্যাটফর্ম এপিআই 28 এ আর সমর্থিত নয় that সেক্ষেত্রে আপনি ম্যানিফেস্ট বা মডিউল স্তরের গ্রেডল ফাইলটিতে অ্যাপাচি উত্তরাধিকার সম্পত্তি সক্ষম করতে পারবেন। তবে ওকে এইচটিটিপি, ভল্লি বা রেট্রোফিট নেটওয়ার্কিং লাইব্রেরি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।
রাহুল রায়না

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- র সাথে অনুরোধগুলি সম্পাদন করার উপায় বর্ণনা করা হয়নি , যা আজকাল অ্যান্ড্রয়েড এবং জাভা সাধারণভাবে খুব জনপ্রিয় এইচটিপি ক্লায়েন্ট, আমি একটি সাধারণ উদাহরণ প্রদান করতে যাচ্ছি:

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

এই গ্রন্থাগারের সুস্পষ্ট সুবিধা হ'ল এটি আমাদের নিম্ন স্তরের বিশদ থেকে বিরত রাখে, তাদের সাথে যোগাযোগের জন্য আরও বন্ধুত্বপূর্ণ এবং সুরক্ষিত উপায় সরবরাহ করে। বাক্য গঠনটিও সরলীকৃত এবং দুর্দান্ত কোড লেখার অনুমতি দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.