OkHttp POST似乎不会发送请求正文

时间:2016-04-08 20:36:06

标签: php android post retrofit2 okhttp3

我正在尝试使用RetroFit2OkHttp3在PHP脚本上执行POST方法。我一直在做GET方法完全没问题,但我一直在发帖时遇到问题。

我使用HttpLoggingInterceptor设置OkHttpClient,并完美记录请求正文。但是我的PHP脚本没有收到数据,所以我试着只在我得到它时输出$_POST数据,但它是一个空字符串。我不知道Android端,服务器端或两者都有问题。

我的RetroFit对象和OkHttpClient设置如下:

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

然后我的RestService界面设置如下:

public interface RestService {

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

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

正如我所提到的,所有似乎都能正常工作,但是当我打电话时:

<?php

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

我得到一组空的括号。

1 个答案:

答案 0 :(得分:2)

我在这里找到了答案:php $_POST array empty upon form submission。 Retrofit自动将Content-Type设置为"application/json; charset=UTF-8",在PHP版本5.0 - 5.19中,有一个bug导致请求正文无法解析为$_POST变量。我正在使用的服务器正在运行PHP 5.10(我无法控制)。

此错误的解决方法是自己从原始请求正文解析JSON数据:

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