Я не понимаю разницы, я кодировал пример, в котором мое приложение отправляет имя пользователя и пароль на сервер с помощью запроса POST с использованием retrofit2.
Сначала я попытался отправить запрос с тегом @Body в методе интерфейса: `
@POST("/testproject/login.php")
Call<TestResponse> sendUsernamePassword(@Body UserData userData);
Но мой login.php ответил без каких-либо тегов тела (имя пользователя, пароль).
Затем я меняю метод отправки запроса с использованием FormEncoding:
@FormUrlEncoded
@POST("/testproject/login.php")
Call<TestResponse> sendUsernamePassword(@Field("username")String username,
@Field("password")String password);
И это начало работать, но я не понимаю, почему дооснащение не могло отправить запрос с помощью аннотации @Body.
Вот login.php
файл
<?php
if (isset($_POST['username']) && isset($_POST['password'])) {
$response['status'] = 'success';
$response['username'] = $_POST['username'] . " received";
$response['password'] = $_POST['password'] . "received";
echo json_encode($response);
} else {
$response['status'] = 'failure';
echo json_encode($response);
}
?>
Может кто-нибудь объяснить, в чем разница и как это можно исправить?
@Body
— Отправляет объекты Java как тело запроса.
@Field
— Отправка данных в виде формы с кодировкой урлен. Параметр @Field работает только с POST.
Для того, чтобы прочитать тело POST json в php, вы можете использовать следующий код:
//Get the request body
$inputJSON = file_get_contents('php://input');
//Convert into array
$input = json_decode($inputJSON, TRUE);
$username = $input['username'];
$password = $input['password'];
Других решений пока нет …