2012-04-29 4 views
7

Po aktualizacji do Ice Cream Sandwich moje żądanie POST już nie działa. Przed ICS, to działa prawidłowo:HttpURLConnection wykonuje zawsze żądanie GET zamiast żądania POST pomimo setDoOutput (true) i 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; 

Próbowałem ustawić

connection.setDoOutput(true); 

ale to nie działa. Odpowiedź serwera to zawsze 405 (metoda niedozwolona), a dziennik serwera mówi, że było to żądanie GET.

Android JavaDoc do setRequestMethod mówi:

Metoda ta może być wywołana tylko zanim połączenie zostanie wykonane.

Czy to oznacza, że ​​metoda musi zostać wywołana przed url.openConnection()? Jak utworzyć instancję HttpURLConnection? Wszystkie przykłady, które widziałem, są takie, jak opisano powyżej.

Mam nadzieję, że ktoś ma pomysł, dlaczego zawsze wysyła żądanie GET zamiast POST.

Z góry dziękuję.

+0

Czy używasz HttpRequest w wątku interfejsu użytkownika? –

+0

Nie wzywam Sposób 'nowej AsyncTask () { \t \t \t @Override \t \t \t chroniony Boolean doInBackground (końcowe pustkę ... params) { //. .. } ' – Cornelius

+0

Twoja odpowiedź znajduje się w tym pytaniu: http://stackoverflow.com/questions/9365829/filenotfoundexception-for-httpurlconnection-in-ice-cream-sandwich – Kekoa

Odpowiedz

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

W dwóch powyższych stwierdzeń wystarczy umieścić

connection.setDoOutput(true) 

przed

connection.setRequestMethod("POST") 

oświadczenie

0

Moje .htaccess miał regułę przepisywania który przekierowany www http: //. Okazało się, że mój kod Java działał dobrze! Reguła przekierowania/przepisywania spowodowała, że ​​moje pierwsze żądanie (POST) przekazało do http i dlatego "stało się" GET. Mój skrypt PHP słuchał tylko POST i mężczyzna podrapał się w głowę, dopóki nie znalazłem własnego błędu z tą regułą przekierowania. Sprawdź swój rodzaj tego "problemu".

Dla mnie ustawienie first setDoOutput lub setRequestMethod nie ma znaczenia, każde zamówienie działa (API 23). W tej chwili rzeczy są w tej kolejności:

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