2012-04-29 21 views
7

Desde la actualización a Ice Cream Sandwich, mi solicitud POST ya no funciona. Antes del ICS, esto funciona bien:HttpURLConnection realiza siempre una solicitud GET en lugar de una solicitud POST a pesar de setDoOutput (true) y setRequestMethod ("POST")

try { 
     final URL url = new URL("http://example.com/api/user"); 
     final HttpURLConnection connection = (HttpURLConnection) url 
       .openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setDoOutput(false); 
     connection.setDoInput(true); 
     connection.setRequestProperty("Content-Length", "0"); 
     if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { 
      Log.w(RestUploader.class.getSimpleName(), ": response code: " + connection.getResponseMessage()); 
     } else { 
      final BufferedReader reader = new BufferedReader(
        new InputStreamReader(connection.getInputStream())); 
      final String line = reader.readLine(); 
      reader.close(); 
      return Long.parseLong(line); 
     } 
    } catch (final MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (final ProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (final IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return -1; 

He tratado de establecer

connection.setDoOutput(true); 

pero no lo hace obras. La respuesta del servidor siempre es un 405 (Método no permitido) y el registro del servidor dice que fue una solicitud GET.

El androide JavaDoc a setRequestMethod dice:

Este método sólo puede ser llamado antes de que se establezca la conexión.

¿Significa que el método debe invocarse antes de url.openConnection()? ¿Cómo debería crear una instancia de HttpURLConnection? Todos los ejemplos que he visto lo hacen como se describió anteriormente.

Espero que alguien tenga una idea de por qué siempre envía una solicitud GET en lugar de una POST.

Gracias de antemano.

+0

¿Utiliza HttpRequest en el hilo de UI? –

+0

No, llamar al método en 'nueva AsyncTask () { \t \t \t @ Override \t \t \t protegida de Boole doInBackground (última Vacío ... params) {// . .. } ' – Cornelius

+0

Su respuesta se encuentra en esta pregunta: http://stackoverflow.com/questions/9365829/filenotfoundexception-for-httpurlconnection-in-ice-cream-sandwich – Kekoa

Respuesta

0
connection.setRequestMethod("POST"); 
connection.setDoOutput(false); 

En dos declaraciones anteriores basta con colocar

connection.setDoOutput(true) 

antes

connection.setRequestMethod("POST") 

comunicado

0

Mi .htaccess tenía una regla de reescritura, que redirige a www http: //. Resultó que mi código Java funcionó bien! La regla de redirección/reescritura hizo que mi primera solicitud (POST) se reenviara a http y, por lo tanto, "se convirtió" en un GET. Mi script PHP estaba escuchando solo POST, y el hombre me rasqué la cabeza hasta que encontré mi propio error al tener esa regla de redirección. Comprueba el tuyo por este tipo de "problema".

Para mí, establecer setDoOutput o setRequestMethod primero no importa, cualquier orden funciona (API 23). Por el momento las cosas están en este orden:

HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
con.setInstanceFollowRedirects(false); 
con.setUseCaches(false); 
con.setRequestMethod("POST"); 
con.setDoOutput(true); 
con.setRequestProperty("Content-Type",bla bla 
con.setRequestProperty("Accept-Charset", "UTF-8"); 
con.setRequestProperty("Content-Length", String.valueOf(PARAMETER_VARIABLE.getBytes().length)); 
con.setFixedLengthStreamingMode(PARAMETER_VARIABLE.getBytes().length); 
OutputStream os = con.getOutputStream(); 
os.write(PARAMETER_VARIABLE.getBytes()); 
os.flush(); 
os.close(); 
Cuestiones relacionadas