Faire une requête HTTP avec Android

J’ai cherché partout mais je n’ai pas trouvé ma réponse, y a-t-il un moyen de faire une simple requête HTTP? Je veux demander une page / un script PHP sur un de mes sites mais je ne veux pas afficher la page Web.

Si possible, je veux même le faire en arrière-plan (dans un BroadcastReceiver)

METTRE À JOUR

C’est une réponse très ancienne. Je ne recommanderai certainement plus le client d’Apache. Au lieu de cela, utilisez soit:

  • OkHttp
  • HttpUrlConnection

Réponse originale

Tout d’abord, demandez une autorisation pour accéder au réseau, ajoutez les éléments suivants à votre manifeste:

 

Le moyen 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); Ssortingng responseSsortingng = out.toSsortingng(); out.close(); //..more logic } else{ //Closes the connection. response.getEntity().getContent().close(); throw new IOException(statusLine.getReasonPhrase()); } 

Si vous voulez qu’il s’exécute sur un thread séparé, je vous recommande d’étendre AsyncTask:

 class RequestTask extends AsyncTask{ @Override protected Ssortingng doInBackground(Ssortingng... uri) { HttpClient httpclient = new DefaultHttpClient(); HttpResponse response; Ssortingng responseSsortingng = 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); responseSsortingng = out.toSsortingng(); 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 responseSsortingng; } @Override protected void onPostExecute(Ssortingng result) { super.onPostExecute(result); //Do anything with response.. } } 

Vous pouvez alors faire une demande en:

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

A moins que vous n’ayez une raison explicite de choisir Aptt HttpClient, vous devriez préférer java.net.URLConnection. Vous pouvez trouver de nombreux exemples d’utilisation sur le Web.

Nous avons également amélioré la documentation Android depuis votre message original: 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

Remarque: Le client HTTP Apache fourni avec Android est maintenant déconseillé en faveur de HttpURLConnection . Veuillez consulter le blog des développeurs Android pour plus de détails.

Ajoutez à votre manifeste.

Vous récupérez alors une page Web comme celle-ci:

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

Je suggère également de l’exécuter sur un thread séparé:

 class RequestTask extends AsyncTask{ @Override protected Ssortingng doInBackground(Ssortingng... uri) { Ssortingng responseSsortingng = 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 responseSsortingng; } @Override protected void onPostExecute(Ssortingng result) { super.onPostExecute(result); //Do anything with response.. } } 

Consultez la documentation pour plus d’informations sur la gestion des réponses et les requêtes POST.

Le moyen le plus simple est d’utiliser la librairie Android appelée Volley

Volley offre les avantages suivants:

Programmation automatique des requêtes réseau. Plusieurs connexions réseau simultanées . Mise en cache transparente des réponses disque et mémoire avec cohérence de cache HTTP standard. Prise en charge de la hiérarchisation des demandes. Demande d’annulation de l’API. Vous pouvez annuler une seule demande ou définir des blocs ou des étendues de requêtes à annuler. Facilité de personnalisation, par exemple, pour réessayer et annuler. Une commande robuste qui facilite le remplissage correct de votre interface utilisateur avec les données extraites de manière asynchrone à partir du réseau. Outils de débogage et de traçage.

Vous pouvez envoyer une requête http / https aussi simple que cela:

  // Instantiate the RequestQueue. RequestQueue queue = Volley.newRequestQueue(this); Ssortingng url ="http://www.yourapi.com"; JsonObjectRequest request = new JsonObjectRequest(url, null, new Response.Listener() { @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); 

Dans ce cas, vous n’avez pas besoin de penser à “exécuter en arrière-plan” ou à “utiliser le cache” vous-même, car tout cela a déjà été fait par Volley.

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

Cordialement

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())); Ssortingng page = ""; Ssortingng inLine; while ((inLine = in.readLine()) != null) { page += inLine; } in.close(); Bundle b = new Bundle(); b.putSsortingng("result", page); m.setData(b); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } handler.sendMessage(m); } } 

Regardez cette nouvelle bibliothèque géniale qui est disponible via gradle 🙂

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

Usage:

 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().toSsortingng(), "Request successful!"); } else { Log.e(this.getClass().toSsortingng(), "Request unsuccessful: " + response); } } }).execute(); 

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

J’ai fait ceci pour un service web sur URL, en utilisant une lib Gson:

Client:

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

Ceci est le nouveau code pour la requête HTTP Get / POST dans Android. HTTPClient est déprécié et peut ne pas être disponible comme dans mon cas.

Ajoutez d’abord les deux dépendances dans build.gradle:

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

Ensuite, écrivez ce code dans la méthode ASyncTask in 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); SsortingngBuilder dta = new SsortingngBuilder(); Ssortingng chunks ; while((chunks = buff.readLine()) != null) { dta.append(chunks); } } else { //Handle else } 

Pour moi, le plus simple est d’utiliser la bibliothèque appelée Retrofit2

Nous avons juste besoin de créer une interface contenant notre méthode de requête, nos parameters, et nous pouvons également créer un en-tête personnalisé pour chaque requête:

  public interface MyService { @GET("users/{user}/repos") Call> listRepos(@Path("user") Ssortingng user); @GET("user") Call getUserDetails(@Header("Authorization") Ssortingng credentials); @POST("users/new") Call createUser(@Body User user); @FormUrlEncoded @POST("user/edit") Call updateUser(@Field("first_name") Ssortingng first, @Field("last_name") Ssortingng last); @Multipart @PUT("user/photo") Call 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 getUser(@Path("username") Ssortingng username); } 

Et le meilleur, c’est que nous pouvons le faire de manière asynchrone facilement en utilisant la méthode de mise en queue

Comme aucune des réponses ne décrit une manière d’effectuer des requêtes avec OkHttp , qui est un client http très populaire de nos jours pour Android et Java en général, je vais vous donner un exemple simple:

 //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"); Ssortingng url = urlBuilder.build().toSsortingng(); //build the request Request request = new Request.Builder().url(url).build(); //execute Response response = client.newCall(request).execute(); 

L’avantage évident de cette bibliothèque est qu’elle nous extrait de certains détails de bas niveau, offrant des moyens plus conviviaux et sécurisés d’interagir avec eux. La syntaxe est également simplifiée et permet d’écrire du code sympa.