2012-04-29 9 views
7

Dopo l'aggiornamento a Ice Cream Sandwich, la mia richiesta POST non funziona più. Prima di ICS, questo funziona bene:HttpURLConnection esegue sempre una richiesta GET invece di una richiesta POST nonostante setDoOutput (true) e 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; 

Ho cercato di impostare

connection.setDoOutput(true); 

ma non è così opere. La risposta del server è sempre un 405 (metodo non consentito) e il log del server dice che si trattava di una richiesta GET.

L'Android JavaDoc a setRequestMethod dice:

Questo metodo può essere chiamato solo prima della connessione.

Significa che il metodo deve essere invocato prima di url.openConnection()? Come dovrei creare un'istanza HttpURLConnection? Tutti gli esempi che ho visto, lo rendono come descritto sopra.

Spero che qualcuno abbia un'idea del perché invii sempre una richiesta GET invece di un POST.

Grazie in anticipo.

+0

Si utilizza HttpRequest nel thread dell'interfaccia utente? –

+0

No, chiamo il metodo in 'nuova AsyncTask () { \t \t \t @Override \t \t \t protetta booleano doInBackground (finale Void ... params) {// . .. } ' – Cornelius

+0

La tua risposta si trova in questa domanda: http://stackoverflow.com/questions/9365829/filenotfoundexception-for-httpurlconnection-in-ice-cream-sandwich – Kekoa

risposta

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

In queste due affermazioni è sufficiente posizionare

connection.setDoOutput(true) 

prima

connection.setRequestMethod("POST") 

dichiarazione

0

mio .htaccess aveva una regola di riscrittura che reindirizzato www a http: //. Ho scoperto che il mio codice Java ha funzionato bene! La regola di reindirizzamento/riscrittura ha reso la mia prima richiesta (POST) da inoltrare a http e quindi "è diventato" un GET. Il mio script PHP stava ascoltando solo POST, e l'uomo mi ha graffiato la testa fino a quando ho trovato il mio errore avere questa regola di reindirizzamento. Controlla il tuo per questo tipo di "problema".

Per me, l'impostazione di setDoOutput o setRequestMethod non ha importanza, qualsiasi ordine funziona (API 23). Al momento le cose sono nell'ordine:

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(); 
Problemi correlati