402 votes

Faire une requête HTTP avec android

J'ai cherché partout mais je ne pouvais pas trouver ma réponse, est-il un moyen de faire une simple requête HTTP? Je veux demander une page PHP / script sur un de mes site, mais je ne veux pas afficher la page web.

Si possible, j'ai même envie de le faire en arrière-plan (dans un BroadcastReceiver)

507voto

Konstantin Burov Points 34011

Tout d'abord, demander une autorisation d'accès au réseau, ajoutez ce qui suit à votre manifeste:

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

Ensuite, le plus simple est d'utiliser Apache http client fourni avec 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);
        out.close();
        String responseString = out.toString();
        //..more logic
    } else{
        //Closes the connection.
        response.getEntity().getContent().close();
        throw new IOException(statusLine.getReasonPhrase());
    }

Si vous voulez qu'il fonctionne sur un autre sujet, je recommande l'extension de 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);
                out.close();
                responseString = out.toString();
            } 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..
    }
}

Ensuite, vous pouvez faire une demande par:

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

68voto

Elliott Hughes Points 3138

sauf si vous avez explicitement la raison de choisir l'Apache HttpClient, vous devriez préférer java.net.URLConnection. vous pouvez trouver beaucoup d'exemples de la façon de l'utiliser sur le web.

nous avons également amélioré l'Android documentation depuis votre message d'origine: http://developer.android.com/reference/java/net/HttpURLConnection.html

et nous avons parlé des compromis sur le blog officiel: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

8voto

Muktesh Kumar Points 251

Essayez, c'est de travailler pour moi.

Tout d'abord, ajouter des autorisations dans le fichier de manifeste:

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

Ensuite, utilisez code ci-dessous pour faire une requête HTTP:

private void getdata() {
    try {
        StrictMode.ThreadPolicy policy = new StrictMode.
          ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy); 
        URL url = new URL("http://ruit.mytechlabs.com/responsive_web_testing.php");
        HttpURLConnection con = (HttpURLConnection) url
          .openConnection();
        readStream(con.getInputStream());
    } catch (Exception e) {
        e.printStackTrace();
    }
}     

private void readStream(InputStream in) {
  BufferedReader reader = null;
  try {
    reader = new BufferedReader(new InputStreamReader(in));
    String line = "";
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    if (reader != null) {
      try {
        reader.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
} 

6voto

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

}

Ce qui concerne

5voto

Tom Medley Points 9722

Avec un fil:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X