2010-02-24 15 views
46

Ho cercato a lungo di inviare una richiesta HttpPost e recuperare la risposta, ma anche se sono riuscito a stabilire una connessione, non riesco ancora a ottenere il messaggio stringa che viene restituito da la richiesta-rispostaHttpPost Android: come ottenere il risultato

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(); 
} 

mi dispiace, mi sembra molto ingenuo, perché io sono nuovo a Java. Mi aiuti per favore.

+0

Ciao, mi sono imbattuto in questo post, e mi chiedevo se puoi dirmi perché il tuo ArrayList è (5) e non (4)? – hellomello

+0

Ho rimosso un Params prima di postarlo qui e ho semplicemente dimenticato di cambiare la lista degli array. –

+2

"HttpClient", "HttpPost", "HttpResponse", "HttpEntity", "EntityUtils", "NameValuePair", "BasicNameValuePair" sono deprecati. Si prega di suggerire un'altra soluzione. –

risposta

96

tenta di utilizzare il EntityUtil della risposta:

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

Ciao Soulreaper, grazie per la tua risposta. Ma perché vengono utilizzati EntityUtils? –

+0

È solo un modo conveniente per estrarre la risposta del byte grezzo contenuto in formato stringa. – Moritz

+0

Grazie @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(); 
    } 

Questo frammento di codice funziona. L'ho preso dopo una ricerca, ma da un codice J2ME.

+0

dove hai aggiunto i valori da inviare con l'url? – zaiff

+0

httppost.setRequestProperty ("parameter_variable_name", value) - Immagino che questo funzionerebbe. Scusa da un po 'di tempo ho provato qualcosa di simile. Non posso ricordare bene. –

+0

Basta dire, che questo snipset è obsoleto da anni e che esiste un altro modo per eseguire le richieste httpost. – Fattum

7

È possibile chiamare il metodo di eseguire con un ResponseHandler. Ecco un esempio:

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

Ciao Sarp, grazie per la tua risposta. Ma qual è il vantaggio di usare questo? –

4

Si può fare questo in questo modo

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

Ciao Siddhpura, stai scrivendo e leggendo allo stesso tempo? Cosa dovrei fare per inviare semplicemente le informazioni? Cerco di fare come te ma non funziona per me. Quale parte è esattamente per inviare i dati con il metodo POST? Grazie! –

+0

@Siddhpura: quale valore devo inserire per il nome dei parametri? Voglio dire, è "id" del parametro di esso è "nome"? mi aiuti per favore. Grazie. – karimkhan

0

Si dovrebbe provare a utilizzare HttpGet invece di HttpPost. Ho avuto un problema simile e l'ho risolto.

Problemi correlati