2010-12-01 9 views
12

Tengo una cadena que ya está en el formato URLEncoded Form adecuado y me gustaría enviarla a través de una solicitud POST en Android a un servidor PHP. Sé que el método para enviar formularios con codificación URL en Android usa el UrlEncodedFormEntity y sé how to use it. El problema con eso es que los datos entran en la función ya codificada en URL y unidos por ampersands, por lo que usar UrlEncodedFormEntity implicaría mucho trabajo adicional para convertirlo en List de NameValuePairs y prefiero no hacerlo.En Android, realice una solicitud POST con datos de formularios codificados en URL sin utilizar UrlEncodedFormEntity

Entonces, ¿cómo hago una solicitud POST adecuada para enviar esta cadena como el cuerpo del contenido?

Ya he intentado usar StringEntity, pero el servidor PHP no obtuvo ninguno de los datos (objeto $_POST vacío).

estoy probando contra http://test.lifewanted.com/echo.json.php, que simplemente es

<?php echo json_encode($_REQUEST); 

Aquí es un ejemplo de los datos ya codificados:

partnerUserID = correo electrónico% 40example.com & partnerUserSecret = mypassword & comando = Autentique

Respuesta

14

Si no le importa usar HttpURLConnection en lugar del (recomendado) HttpClient, entonces puede hacerlo de esta manera:

public void performPost(String encodedData) { 
    HttpURLConnection urlc = null; 
    OutputStreamWriter out = null; 
    DataOutputStream dataout = null; 
    BufferedReader in = null; 
    try { 
     URL url = new URL(URL_LOGIN_SUBMIT); 
     urlc = (HttpURLConnection) url.openConnection(); 
     urlc.setRequestMethod("POST"); 
     urlc.setDoOutput(true); 
     urlc.setDoInput(true); 
     urlc.setUseCaches(false); 
     urlc.setAllowUserInteraction(false); 
     urlc.setRequestProperty(HEADER_USER_AGENT, HEADER_USER_AGENT_VALUE); 
     urlc.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
     dataout = new DataOutputStream(urlc.getOutputStream()); 
     // perform POST operation 
     dataout.writeBytes(encodedData); 
     int responseCode = urlc.getResponseCode(); 
     in = new BufferedReader(new InputStreamReader(urlc.getInputStream()),8096); 
     String response; 
     // write html to System.out for debug 
     while ((response = in.readLine()) != null) { 
      System.out.println(response); 
     } 
     in.close(); 
    } catch (ProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (out != null) { 
      try { 
       out.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (in != null) { 
      try { 
       in.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+5

buena respuesta. en Gingerbread y más tarde, HttpURLConnection es el camino a seguir. considere que Apache HttpClient está en desuso. –

+1

Me acabo de dar cuenta de que nunca acepté esto como la respuesta. Esto funcionó para mí genial. ¡Gracias! –

+2

Dos cosas: InputStreamReader, de acuerdo con los documentos de Android (http://developer.android.com/reference/java/io/InputStreamReader.html) ya está en el búfer, por lo que no es necesario BufferedReader. Y, también de acuerdo con los documentos de Android, al final de su uso, debe (o más bien debe) llamar a disconnect() en HttpURLConnection para liberar recursos. – Gonan

Cuestiones relacionadas