50 votes

Android HttpPost : comment obtenir le résultat

J'essaie depuis longtemps d'envoyer une requête HttpPost et de récupérer la réponse, mais même si j'ai réussi à établir une connexion, je ne sais pas encore comment obtenir le message de la chaîne de caractères qui est renvoyé par la requête-réponse.

 HttpClient httpclient = new DefaultHttpClient();
 HttpPost httppost = new HttpPost("http://www.myurl.com/app/page.php");
 // Add your data   
 List < NameValuePair > nameValuePairs = new ArrayList < NameValuePair > (5);
 nameValuePairs.add(new BasicNameValuePair("type", "20"));
 nameValuePairs.add(new BasicNameValuePair("mob", "919895865899"));
 nameValuePairs.add(new BasicNameValuePair("pack", "0"));
 nameValuePairs.add(new BasicNameValuePair("exchk", "1"));

 try {
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
     Log.d("myapp", "works till here. 2");
     try {
         HttpResponse response = httpclient.execute(httppost);
         Log.d("myapp", "response " + response.getEntity());
     } catch (ClientProtocolException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
 } catch (UnsupportedEncodingException e) {
     e.printStackTrace();
 } 

Je suis désolé, j'ai l'air très naïf parce que je suis nouveau en Java. Aidez-moi, s'il vous plaît.

0 votes

Bonjour, je suis tombé sur ce post, et je me demandais si vous pouviez me dire pourquoi votre ArrayList est (5) et non (4) ?

0 votes

J'ai supprimé un Params avant de le poster ici et j'ai juste oublié de changer la liste des tableaux.

2 votes

"HttpClient", "HttpPost", "HttpResponse", "HttpEntity", "EntityUtils", "NameValuePair", "BasicNameValuePair" sont obsolètes. Veuillez suggérer une autre solution.

99voto

Moritz Points 3760

Essayez d'utiliser le EntityUtil sur votre réponse :

String responseBody = EntityUtils.toString(response.getEntity());

0 votes

Bonjour Soulreaper, Merci pour votre réponse. Mais pourquoi utiliser EntityUtils ?

0 votes

Il s'agit simplement d'un moyen pratique d'extraire la réponse brute contenue dans l'octet sous forme de chaîne.

3 votes

À partir du niveau 22 de l'API, EntityUtils est déprécié. Tout comme l'ensemble du org.apache.http paquet.

8voto

Sumit M Asok Points 906
    URL url;
    url = new URL("http://www.url.com/app.php");
    URLConnection connection;
    connection = url.openConnection();
    HttpURLConnection httppost = (HttpURLConnection) connection;
    httppost.setDoInput(true);
    httppost.setDoOutput(true);
    httppost.setRequestMethod("POST");
    httppost.setRequestProperty("User-Agent", "Tranz-Version-t1.914");
    httppost.setRequestProperty("Accept_Language", "en-US");
    httppost.setRequestProperty("Content-Type",
            "application/x-www-form-urlencoded");
    DataOutputStream dos = new DataOutputStream(httppost.getOutputStream());
    dos.write(b); // bytes[] b of post data

    String reply;
    InputStream in = httppost.getInputStream();
    StringBuffer sb = new StringBuffer();
    try {
        int chr;
        while ((chr = in.read()) != -1) {
            sb.append((char) chr);
        }
        reply = sb.toString();
    } finally {
        in.close();
    }

Cet extrait de code fonctionne. Je l'ai obtenu après une longue recherche, mais à partir d'un code J2ME.

0 votes

Où avez-vous ajouté les valeurs à envoyer avec l'url ?

0 votes

Httppost.setRequestProperty("nom_variable_paramètre",valeur) - Je suppose que cela devrait fonctionner. Désolé, cela fait longtemps que je n'ai pas essayé quelque chose de similaire. Je ne me souviens pas bien.

0 votes

Je dis juste que ce snipset est dépassé depuis des années et qu'il y a une autre façon d'exécuter les requêtes httpost.

7voto

Sarp Centel Points 1032

Vous pouvez appeler la méthode d'exécution avec un ResponseHandler. Voici un exemple :

ResponseHandler<String> responseHandler = new BasicResponseHandler();
String response = httpClient.execute(httppost, responseHandler);

1 votes

Bonjour Sarp, Merci pour votre réponse. Mais, quel est l'avantage d'utiliser ce système ?

4voto

Siddhpura Amit Points 3562

Vous pouvez le faire de cette façon :

 public class MyHttpPostProjectActivity extends Activity implements OnClickListener {

        private EditText usernameEditText;
        private EditText passwordEditText;
        private Button sendPostReqButton;
        private Button clearButton;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.login);

            usernameEditText = (EditText) findViewById(R.id.login_username_editText);
            passwordEditText = (EditText) findViewById(R.id.login_password_editText);

            sendPostReqButton = (Button) findViewById(R.id.login_sendPostReq_button);
            sendPostReqButton.setOnClickListener(this);

            clearButton = (Button) findViewById(R.id.login_clear_button);
            clearButton.setOnClickListener(this);        
        }

        @Override
        public void onClick(View v) {

            if(v.getId() == R.id.login_clear_button){
                usernameEditText.setText("");
                passwordEditText.setText("");
                passwordEditText.setCursorVisible(false);
                passwordEditText.setFocusable(false);
                usernameEditText.setCursorVisible(true);
                passwordEditText.setFocusable(true);
            }else if(v.getId() == R.id.login_sendPostReq_button){
                String givenUsername = usernameEditText.getEditableText().toString();
                String givenPassword = passwordEditText.getEditableText().toString();

                System.out.println("Given username :" + givenUsername + " Given password :" + givenPassword);

                sendPostRequest(givenUsername, givenPassword);
            }   
        }

        private void sendPostRequest(String givenUsername, String givenPassword) {

            class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{

                @Override
                protected String doInBackground(String... params) {

                    String paramUsername = params[0];
                    String paramPassword = params[1];

                    System.out.println("*** doInBackground ** paramUsername " + paramUsername + " paramPassword :" + paramPassword);

                    HttpClient httpClient = new DefaultHttpClient();

                    // In a POST request, we don't pass the values in the URL.
                    //Therefore we use only the web page URL as the parameter of the HttpPost argument
                    HttpPost httpPost = new HttpPost("http://www.nirmana.lk/hec/android/postLogin.php");

                    // Because we are not passing values over the URL, we should have a mechanism to pass the values that can be
                    //uniquely separate by the other end.
                    //To achieve that we use BasicNameValuePair             
                    //Things we need to pass with the POST request
                    BasicNameValuePair usernameBasicNameValuePair = new BasicNameValuePair("paramUsername", paramUsername);
                    BasicNameValuePair passwordBasicNameValuePAir = new BasicNameValuePair("paramPassword", paramPassword);

                    // We add the content that we want to pass with the POST request to as name-value pairs
                    //Now we put those sending details to an ArrayList with type safe of NameValuePair
                    List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
                    nameValuePairList.add(usernameBasicNameValuePair);
                    nameValuePairList.add(passwordBasicNameValuePAir);

                    try {
                        // UrlEncodedFormEntity is an entity composed of a list of url-encoded pairs. 
                        //This is typically useful while sending an HTTP POST request. 
                        UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList);

                        // setEntity() hands the entity (here it is urlEncodedFormEntity) to the request.
                        httpPost.setEntity(urlEncodedFormEntity);

                        try {
                            // HttpResponse is an interface just like HttpPost.
                            //Therefore we can't initialize them
                            HttpResponse httpResponse = httpClient.execute(httpPost);

                            // According to the JAVA API, InputStream constructor do nothing. 
                            //So we can't initialize InputStream although it is not an interface
                            InputStream inputStream = httpResponse.getEntity().getContent();

                            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

                            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                            StringBuilder stringBuilder = new StringBuilder();

                            String bufferedStrChunk = null;

                            while((bufferedStrChunk = bufferedReader.readLine()) != null){
                                stringBuilder.append(bufferedStrChunk);
                            }

                            return stringBuilder.toString();

                        } catch (ClientProtocolException cpe) {
                            System.out.println("First Exception caz of HttpResponese :" + cpe);
                            cpe.printStackTrace();
                        } catch (IOException ioe) {
                            System.out.println("Second Exception caz of HttpResponse :" + ioe);
                            ioe.printStackTrace();
                        }

                    } catch (UnsupportedEncodingException uee) {
                        System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee);
                        uee.printStackTrace();
                    }

                    return null;
                }

                @Override
                protected void onPostExecute(String result) {
                    super.onPostExecute(result);

                    if(result.equals("working")){
                        Toast.makeText(getApplicationContext(), "HTTP POST is working...", Toast.LENGTH_LONG).show();
                    }else{
                        Toast.makeText(getApplicationContext(), "Invalid POST req...", Toast.LENGTH_LONG).show();
                    }
                }           
            }

            SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
            sendPostReqAsyncTask.execute(givenUsername, givenPassword);     
        }
    }

0 votes

Bonjour Siddhpura, écrivez-vous et lisez-vous en même temps ? Que dois-je faire pour juste envoyer l'information ? J'ai essayé de faire comme vous mais ça ne marche pas pour moi. Quelle est la partie exacte pour envoyer les données avec la méthode POST ? Je vous remercie !

0 votes

@Siddhpura : quelle valeur dois-je mettre pour le nom des paramètres ? je veux dire que c'est "id" du paramètre ou c'est "nom" ? s'il vous plaît aidez-moi. merci.

1voto

SamB Points 11

Essayez ceci, ça semble être le plus compact. Bien que dans le monde réel, vous devrez utiliser une requête asynchrone pour que le dispositif ne se bloque pas pendant la récupération de la page demandée.

http://www.softwarepassion.com/Android-series-get-post-and-multipart-post-requests/

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