سؤال

لقد بحثت في كل مكان ولكني لم أجد إجابتي ، هل هناك طريقة لتقديم طلب HTTP بسيط؟ أريد أن أطلب صفحة / نص PHP على أحد موقعي الإلكتروني ، لكنني لا أريد إظهار صفحة الويب.

إذا كان ذلك ممكنًا ، حتى أنني أرغب في القيام بذلك في الخلفية (في برودكاسستير)

هل كانت مفيدة؟

المحلول

تحديث

هذه إجابة قديمة جدا. بالتأكيد لن أوصي عميل Apache بعد الآن. بدلاً من ذلك ، استخدم إما:

الإجابة الأصلية

بادئ ذي بدء ، اطلب إذنًا للوصول إلى الشبكة ، أضف متابعًا إلى بيانك:

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

ثم أسهل طريقة هي استخدام عميل Apache HTTP المجمعة مع Android:

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

نصائح أخرى

ما لم يكن لديك سبب صريح لاختيار Apache httpclient ، يجب أن تفضل java.net.urlconnection. يمكنك العثور على الكثير من الأمثلة على كيفية استخدامه على الويب.

قمنا أيضًا بتحسين وثائق Android منذ مشاركتك الأصلية: http://developer.android.com/reference/java/net/httpurlconnection.html

وتحدثنا عن المفاضلات على المدونة الرسمية: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

ملاحظة: يتم الآن إهمال عميل Apache HTTP المجمع مع Android لصالح httpurlconnection. يرجى الاطلاع على مطوري Android مقالات لمزيد من التفاصيل.

يضيف <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..
}
}

انظر توثيق لمزيد من المعلومات حول معالجة الاستجابة وطلبات البريد.

الطريقة الأكثر بساطة هي استخدام Android LIB المسمى طائرة

يوفر Volley الفوائد التالية:

الجدولة التلقائية لطلبات الشبكة. اتصالات شبكة متزامنة متعددة. القرص الشفاف والاستجابة للذاكرة التخزين المؤقت مع تماسك ذاكرة التخزين المؤقت HTTP القياسية. دعم طلب الأولوية. طلب الإلغاء API. يمكنك إلغاء طلب واحد ، أو يمكنك تعيين كتل أو نطاقات من الطلبات لإلغاء. سهولة التخصيص ، على سبيل المثال ، لإعادة المحاولة والتراجع. الطلب القوي الذي يجعل من السهل ملء واجهة المستخدم بشكل صحيح مع البيانات التي تم جلبها بشكل غير متزامن من الشبكة. أدوات تصحيح الأخطاء والتتبع.

يمكنك إرسال طلب 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);

في هذه الحالة ، لا تحتاج إلى النظر في "الركض في الخلفية" أو "استخدام ذاكرة التخزين المؤقت" بنفسك لأن كل هذه الأشياء قد تم بالفعل بواسطة Volley.

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

}

يعتبر

انظر إلى هذه المكتبة الجديدة الرائعة التي تتوفر عبر Gradle :)

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

مع موضوع:

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

لقد صنعت هذا لخدمة WebSERESS على عنوان 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;
}

هذا هو الرمز الجديد لطلب/نشر HTTP في Android. 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
 }

بالنسبة لي ، أسهل طريقة هي استخدام المكتبة RETROFIT2

نحتاج فقط إلى إنشاء واجهة تحتوي على طريقة طلبنا ومعلماتها ، وأيضًا يمكننا إنشاء رأس مخصص لكل طلب:

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

    }

والأفضل هو ، يمكننا القيام بذلك بشكل غير متزامن بسهولة باستخدام طريقة enqueue

نظرًا لعدم وصف أي من الإجابات طريقة لأداء الطلبات Okhttp, ، وهو عميل HTTP شائع جدًا في الوقت الحاضر لنظام Android و Java بشكل عام ، سأقدم مثالًا بسيطًا:

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

تتمثل الميزة الواضحة لهذه المكتبة في أنها تمنعنا من بعض التفاصيل ذات المستوى المنخفض ، مما يوفر طرقًا أكثر ودية وأمانًا للتفاعل معها. بناء الجملة مبسط أيضًا ويسمح لكتابة رمز لطيف.

استخدام التسوية كما هو مقترح أعلاه. أضف متابعًا إلى 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 وهو بسيط للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top