2010-02-24 5 views
46

J'ai essayé longtemps d'envoyer une requête HttpPost et d'obtenir une réponse, mais même si j'ai été en mesure de faire une connexion, je ne sais pas encore comment obtenir le message de chaîne qui est retourné par la demande-réponseAndroid HttpPost: comment obtenir le résultat

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é, je semble très naïf parce que je suis nouveau à Java. Aidez-moi, s'il vous plaît.

+0

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

+0

J'ai enlevé un Params avant de l'afficher ici et j'ai juste oublié de changer la liste de tableau. –

+2

"HttpClient", "HttpPost", "HttpResponse", "HttpEntity", "EntityUtils", "NameValuePair", "BasicNameValuePair" sont obsolètes. S'il vous plaît proposer une autre solution. –

Répondre

96

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

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

Salut Soulreaper, Merci pour votre réponse. Mais pourquoi EntityUtils est-il utilisé? –

+0

Il s'agit simplement d'un moyen pratique d'extraire la réponse en octets bruts contenus sous forme de chaîne. – Moritz

+0

Merci @Moritz – Hamid

7
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 eu après la recherche, mais à partir d'un code J2ME.

+0

où avez-vous ajouté les valeurs à envoyer avec l'URL? – zaiff

+0

httppost.setRequestProperty ("parameter_variable_name", value) - Je suppose que cela fonctionnerait. Désolé été depuis un moment, j'ai essayé quelque chose de similaire. Je ne me souviens pas bien. –

+0

Juste dire, que ce morceau est obsolète depuis des lustres et il y a une autre façon d'exécuter des demandes de https. – Fattum

7

Vous pouvez appeler exécuter la méthode avec un ResponseHandler. Voici un exemple:

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

Salut Sarp, Merci pour votre réponse. Mais, quel est l'avantage de l'utiliser? –

4

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

Salut Siddhpura, écrivez-vous et lisez-vous en même temps? Que dois-je faire pour simplement envoyer l'information? J'essaie de faire comme toi mais ça ne marche pas pour moi. Quelle partie est-ce exactement pour envoyer les données avec la méthode POST? Je vous remercie! –

+0

@Siddhpura: quelle valeur dois-je mettre pour le nom des paramètres? je veux dire est-il "id" du paramètre de c'est "nom"? Aidez-moi, s'il vous plaît. Merci. – karimkhan

0

Vous devriez essayer d'utiliser HttpGet au lieu de HttpPost. J'ai eu un problème similaire et cela a résolu.

Questions connexes