2010-02-24 9 views
46

He intentado durante mucho tiempo enviar una solicitud de HttpPost y recuperar la respuesta, pero a pesar de que pude establecer una conexión aún no entiendo cómo obtener el mensaje de cadena que devuelve la solicitud-respuestaAndroid HttpPost: cómo obtener el resultado

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

Lo siento, me suena muy ingenuo porque soy nuevo en java. Por favor, ayúdame.

+0

Hola, me encontré con esta publicación, y me preguntaba si me puede decir por qué su ArrayList es (5) y no (4)? – hellomello

+0

Quité un parámetro antes de publicarlo aquí y me olvidé de cambiar la lista de arreglos. –

+2

"HttpClient", "HttpPost", "HttpResponse", "HttpEntity", "EntityUtils", "NameValuePair", "BasicNameValuePair" están en desuso. Por favor sugiera otra solución. –

Respuesta

96

intenta utilizar la EntityUtil de su respuesta:

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

Hola, Soulreaper, gracias por tu respuesta. Pero, ¿por qué se usa EntityUtils? –

+0

Es solo una manera conveniente de extraer la respuesta del byte sin formato contenido en forma de cadena. – Moritz

+0

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

Este fragmento de código funciona. Lo obtuve después de la búsqueda, pero a partir de un código J2ME.

+0

¿dónde agregaste los valores que se enviarán con la url? – zaiff

+0

httppost.setRequestProperty ("parameter_variable_name", value) - Supongo que esto funcionaría. Lo siento desde hace un tiempo que he intentado algo similar. No pude recordar bien. –

+0

Solo digo que este snipset está desactualizado durante años y que hay otra forma de ejecutar las solicitudes de httpost. – Fattum

7

Puede llamar método de ejecución con un ResponseHandler. Aquí hay un ejemplo:

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

Hola Sarp, gracias por tu respuesta. Pero, ¿cuál es la ventaja de usar esto? –

4

Usted puede hacer esto de esta manera

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

Hola Siddhpura, ¿estás escribiendo y leyendo al mismo tiempo? ¿Qué debo hacer solo por enviar la información? Intento hacer como tú pero no funciona para mí. ¿Qué parte es exactamente para enviar los datos con el método POST? ¡Gracias! –

+0

@Siddhpura: ¿qué valor debo poner para el nombre de los parámetros? quiero decir, ¿es "id" del parámetro "it" el "nombre"? por favor, ayúdame. Gracias. – karimkhan

0

debería intentar usar HttpGet en lugar de HttpPost. Tuve un problema similar y eso lo resolvió.

Cuestiones relacionadas