Я пытаюсь использовать RetroFit2
а также OkHttp3
сделать метод POST на PHP-скрипте. Я прекрасно делал методы 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);
}
Я получаю пустой набор скобок.
Я нашел свой ответ здесь: При отправке формы массив php $ _POST пуст. Дооснащение автоматически устанавливает Content-Type
в "application/json; charset=UTF-8"
, который в PHP версии 5.0 — 5.19, есть ошибка в результате чего тело запроса не будет проанализировано в $_POST
переменная. Сервер, который я использую, работает под управлением PHP 5.10 (который я не могу контролировать).
Обходной путь для этой ошибки — самостоятельно проанализировать данные JSON из необработанного тела запроса:
if($_SERVER['CONTENT_TYPE'] === 'application/json; charset=UTF-8') {
$_POST = json_decode(file_get_contents('php://input'));
}
Других решений пока нет …