Почему Retrofit2 работает с @Field, а не @Body для POST-запросов

Я не понимаю разницы, я кодировал пример, в котором мое приложение отправляет имя пользователя и пароль на сервер с помощью запроса 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);
}

?>

Может кто-нибудь объяснить, в чем разница и как это можно исправить?

0

Решение

@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'];
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]