2016-04-08 7 views
2

Ich versuche, RetroFit2 und OkHttp3 zu verwenden, um eine POST-Methode für ein PHP-Skript. Ich habe GET-Methoden völlig in Ordnung, aber ich habe Probleme mit dem Posten.OKHttp POST scheint nicht zu senden Anfrage-Nachricht

Ich habe eine HttpLoggingInterceptor eingerichtet mit meiner OkHttpClient, und es protokolliert den Anfragekörper perfekt. Aber mein PHP-Skript hat die Daten nicht empfangen, daher habe ich versucht, die $_POST Daten auszugeben, sobald ich sie bekommen habe, aber es ist eine leere Zeichenfolge. Ich kann nicht sagen, ob auf der Android-Seite, der Server-Seite oder bei beiden etwas nicht stimmt.

Mein RetroFit Objekt und OkHttpClient sind wie so ein:

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

OkHttpClient client = new OkHttpClient.Builder() 
     .cookieJar(RestCookieJar.getInstance()) 
     .addInterceptor(interceptor) 
     .build(); 

Gson gson = new GsonBuilder() 
     .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
     .registerTypeAdapter(Instant.class, new InstantAdapter()) 
     .registerTypeAdapter(LatLng.class, new LatLngAdapter()) 
     .registerTypeAdapter(Uri.class, new UriAdapter()) 
     .create(); 

Retrofit retrofit = new Retrofit.Builder() 
     .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
     .addConverterFactory(GsonConverterFactory.create(gson)) 
     .client(client) 
     .baseUrl(BASE_URL) 
     .build(); 

RestService service = retrofit.create(RestService.class); 

Dann wird meine RestService Schnittstelle wie folgt ein:

public interface RestService { 

    @GET("api/index.php") 
    Call<List<Session>> getSessions(); 

    @POST("api/index.php") 
    Call<ResponseBody> postSession(@Body Session session); 
} 

Wie ich bereits erwähnt, dies alles scheint zu funktionieren , aber wenn ich anrufe:

<?php 

    if($_SERVER['REQUEST_METHOD'] === 'POST') { 
     print_r($_POST); 
    } 

Ich bekomme eine leere Klammer.

Antwort

1

Ich fand meine Antwort hier: php $_POST array empty upon form submission. Retrofit setzt automatisch Content-Type auf "application/json; charset=UTF-8", was in den PHP-Versionen 5.0 - 5.19 eine bug gibt, die dazu führt, dass der Anfragetext nicht in die Variable $_POST geparst wird. Der Server, den ich benutze, läuft mit PHP 5.10 (auf das ich keine Kontrolle habe).

für diesen Fehler dieses Problem umgehen, die JSON-Daten selbst aus dem rohen Anfrage Körper zu analysieren:

if($_SERVER['CONTENT_TYPE'] === 'application/json; charset=UTF-8') { 
    $_POST = json_decode(file_get_contents('php://input')); 
}