46 votes

Android, Java : Demande HTTP POST

Je dois faire une requête http post à un service web pour authentifier l'utilisateur avec son nom d'utilisateur et son mot de passe. Le responsable du service Web m'a donné les informations suivantes pour construire une requête HTTP Post.

POST /login/dologin HTTP/1.1
Host: webservice.companyname.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 48

id=username&num=password&remember=on&output=xml

La réponse XML que je vais obtenir est

<?xml version="1.0" encoding="ISO-8859-1"?>
<login>
 <message><![CDATA[]]></message>
 <status><![CDATA[true]]></status>
 <Rlo><![CDATA[Username]]></Rlo>
 <Rsc><![CDATA[9L99PK1KGKSkfMbcsxvkF0S0UoldJ0SU]]></Rsc>
 <Rm><![CDATA[b59031b85bb127661105765722cd3531==AO1YjN5QDM5ITM]]></Rm>
 <Rl><![CDATA[username@company.com]]></Rl>
 <uid><![CDATA[3539145]]></uid>
 <Rmu><![CDATA[f8e8917f7964d4cc7c4c4226f060e3ea]]></Rmu>
</login>

Voici ce que je fais HttpPost postRequest = new HttpPost(urlString) ; Comment puis-je construire le reste des paramètres ?

86voto

BalusC Points 498232

Voici un exemple trouvé précédemment à androidsnippets.com (le site n'est actuellement plus maintenu).

// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");

try {
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("id", "12345"));
    nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);

} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
} catch (IOException e) {
    // TODO Auto-generated catch block
}

Ainsi, vous pouvez ajouter vos paramètres comme BasicNameValuePair .

Une alternative est d'utiliser (Http)URLConnection . Voir aussi Utilisation de java.net.URLConnection pour lancer et traiter des requêtes HTTP . C'est en fait la méthode préférée dans les versions Android les plus récentes (Gingerbread+). Voir aussi ce blog , ce document destiné aux développeurs et celle d'Android HttpURLConnection javadoc .

1 votes

Existe-t-il un moyen simple d'ajouter des tableaux ? Faut-il les parcourir en boucle et ajouter la paire BasicNameValuePair("array[]",array[i]) ?

1 votes

Est-il également efficace sur les fichiers JSON au lieu de XML ?

3 votes

Pour Android 2.3 et plus, Google recommande d'utiliser HttpURLConnection. developer.Android.com/reference/org/apache/http/impl/client/

6voto

Fabricio PH Points 675

À la réponse de @BalusC j'ajouterais comment convertir la réponse en String :

HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null) {
    InputStream instream = entity.getContent();

    String result = RestClient.convertStreamToString(instream);
    Log.i("Read from server", result);
}

Voici un exemple de convertStramToString .

5voto

gigadot Points 5419

Veuillez envisager d'utiliser HttpPost. Adoptez-la : http://www.javaworld.com/javatips/jw-javatip34.html

URLConnection connection = new URL("http://webservice.companyname.com/login/dologin").openConnection();
// Http Method becomes POST
connection.setDoOutput(true);

// Encode according to application/x-www-form-urlencoded specification
String content =
    "id=" + URLEncoder.encode ("username") +
    "&num=" + URLEncoder.encode ("password") +
    "&remember=" + URLEncoder.encode ("on") +
    "&output=" + URLEncoder.encode ("xml");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

// Try this should be the length of you content.
// it is not neccessary equal to 48. 
// content.getBytes().length is not neccessarily equal to content.length() if the String contains non ASCII characters.
connection.setRequestProperty("Content-Length", content.getBytes().length); 

// Write body
OutputStream output = connection.getOutputStream(); 
output.write(content.getBytes());
output.close();

Vous devrez attraper l'exception vous-même.

0 votes

Comment puis-je imprimer la réponse ?

2voto

Muktesh Kumar Points 251

Essayez ceci pour faire une requête http dans Android

private void getdata(){
          try {
              StrictMode.ThreadPolicy policy = new StrictMode.
                      ThreadPolicy.Builder().permitAll().build();
                      StrictMode.setThreadPolicy(policy);
              URL url = new URL("http://www.google.com");
              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();
                    }
                }
              }
            }

0voto

TheCoolah Points 168

Essayez HttpClient pour Java :

http://hc.apache.org/httpclient-3.x/

2 votes

Avez-vous manqué le Android étiquette ? Il utilise déjà (une version allégée de) HttpClient sous la couverture ! Voir aussi le javadoc HttpPost .

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