web-dev-qa-db-fra.com

Android, Java: HTTP POST Request

Je dois faire une demande de publication http à un service Web pour authentifier l'utilisateur avec un nom d'utilisateur et un mot de passe. Le gars du service Web m'a donné les informations suivantes pour construire la 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 j'obtiendrai 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[[email protected]]]></Rl>
 <uid><![CDATA[3539145]]></uid>
 <Rmu><![CDATA[f8e8917f7964d4cc7c4c4226f060e3ea]]></Rmu>
</login>

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

43
Faheem Kalsekar

Voici un exemple précédemment trouvé sur 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 sous la forme BasicNameValuePair .

Une alternative consiste à utiliser (Http)URLConnection. Voir aussi tilisation de Java.net.URLConnection pour déclencher et gérer les requêtes HTTP . C'est en fait la méthode préférée dans les nouvelles versions Android versions (Gingerbread +). Voir aussi ce blog , ce document développeur et Android HttpURLConnection javadoc .

84
BalusC

à la réponse @BalusC, j'ajouterais comment convertir la réponse en une chaîne:

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 .

6
Fabricio PH

Veuillez envisager d'utiliser HttpPost. Adoptez à partir de ceci: 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 saisir l'exception vous-même.

3
gigadot

Je vous recommande plutôt d'utiliser Volley pour faire GET, PUT, POST ... requêtes.

Tout d'abord, ajoutez la dépendance dans votre fichier Gradle.

compile 'com.he5ed.lib:volley:Android-cts-5.1_r4'

Maintenant, utilisez cet extrait de code pour faire des demandes.

RequestQueue queue = Volley.newRequestQueue(getApplicationContext());

        StringRequest postRequest = new StringRequest( com.Android.volley.Request.Method.POST, mURL,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response) {
                        // response
                        Log.d("Response", response);
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // error
                        Log.d("Error.Response", error.toString());
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String>  params = new HashMap<String, String>();
                //add your parameters here as key-value pairs
                params.put("username", username);
                params.put("password", password);

                return params;
            }
        };
        queue.add(postRequest);
2
Bugs Buggy

Vous pouvez réutiliser l'implémentation que j'ai ajoutée à ACRA: http://code.google.com/p/acra/source/browse/tags/REL-3_1_0/CrashReport/src/org/acra/HttpUtils.java? r = 236

(Voir la méthode doPost (Map, Url), fonctionnant sur http et https même avec des certificats auto-signés)

0
Kevin Gaudin

Essayez HttpClient pour Java:

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

0
TheCoolah

J'ai utilisé le code suivant pour envoyer HTTP POST depuis mon Android vers l'application de bureau C # sur mon serveur:

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

J'ai travaillé sur la lecture de la demande d'une application C # sur mon serveur (quelque chose comme une petite application de serveur Web). J'ai réussi à lire les données publiées par la demande à l'aide du code suivant:

server = new HttpListener();
server.Prefixes.Add("http://*:50000/");
server.Start();

HttpListenerContext context = server.GetContext();
HttpListenerContext context = obj as HttpListenerContext;
HttpListenerRequest request = context.Request;

StreamReader sr = new StreamReader(request.InputStream);
string str = sr.ReadToEnd();
0
ossamacpp