wiki android par frandroid

Requête HTTP POST

De FrAndroid - Android docs.

Nous allons voir dans ce tutoriel comment envoyer une requête HTTP POST vers par exemple un script PHP que vous aurez mis en place.


Sommaire

Charger les classes dont nous avons besoin

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.http.NameValuePair;
  5. import org.apache.http.client.ClientProtocolException;
  6. import org.apache.http.client.HttpClient;
  7. import org.apache.http.client.entity.UrlEncodedFormEntity;
  8. import org.apache.http.client.methods.HttpPost;
  9. import org.apache.http.impl.client.DefaultHttpClient;
  10. import org.apache.http.message.BasicNameValuePair;


Construction de la requête

Pour construire la requête POST, nous allons créer un objet org.apache.http.client.methods.HttpPost . Pour de plus amples informations à propos de cet objet, consultez la documentation.

Dans cet exemple, nous allons utiliser le constructeur HttpPost(String uri) qui prend en paramètre une chaine de caractères décrivant l'URL de votre cible.


  1. HttpPost httppost = new HttpPost("http://www.monsite.fr/monscript.php");


Maintenant, nous allons joindre à la requête des paramètres. Pour cela nous allons utiliser un objet une Liste de org.apache.http.NameValuePair. NameValuePair est une simple classe permettant d'encapsuler un couple de nom/valeur. C'est un classe abstraite, vous pouvez donc écrire une classe qui en dérive selon vos besoins, ou alors utiliser une de ses classes filles : org.apache.http.message.BasicNameValuePair.

Tout d'abord nous allons instancier une liste de NameValuePair puis nous allons y rajouter des éléments.

Nous allons créer un BasicNameValuePair (ou une instance d'un autre dérivé de NameValuePair) pour chaque paramètre à envoyer par la requête puis la rajouter à notre liste grâce au constructeur BasicNameValuePair(String name, String value)

Par exemple si je veux envoyer deux paramètres nom et age de valeurs respectivement Moons et 21 :


  1. List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); //On crée la liste qui contiendra tous nos paramètres
  2.  
  3. //Et on y rajoute nos paramétres
  4. nameValuePairs.add(new BasicNameValuePair("nom", "Moons"));
  5. nameValuePairs.add(new BasicNameValuePair("age", "21"));


Enfin, on lie la liste de paramètres à l'instance de HttpPost créée précedemment.


  1. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Envoyer la requête

On envoie la requête grâce à un objet de type org.apache.http.client.HttpClient. Nous prenderons ici un dérivé de HttpClient : DefaultHttpClient


  1. HttpClient httpclient = new DefaultHttpClient();
  2. httpclient.execute(httppost); //Voila, la requête est envoyée

Intercepter les exceptions

Des erreurs peuvent intervenir pendant la construction ou l'envoi de la requête.

N'oubliez surtout pas d'intercepter les exceptions suivantes java.io.IOException et org.apache.http.client.ClientProtocolException


Récupérer la réponse de la requête

Selon vos besoins, vous pourriez avoir besoin de récupérer la réponse à la requête envoyée. C'est trés simple, il suffit de passer par une instance de org.apache.http.HttpResponse pour récuperer un java.io.BufferedReader

N'oublions donc pas de charger les classes nécessaires:


  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import org.apache.http.HttpResponse;


Il faut ensuite modifier un peu le code plus haut, en récupérant une instance de HttpResponse à partir de la méthode HttpClient.execute(HttpUriRequest request)

  1. HttpResponse response=httpclient.execute(httppost);
  2. BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));


Il suffit ensuite de lire depuis notre BufferedReader: consultez la documentation.

Si vous ne devez lire qu'une ligne, la ligne de code suivante devrait suffir:

  1. String s = reader.readLine();