为什么Retrofit2适用于@Field而不适用于@Body的POST请求

时间:2017-06-09 08:41:00

标签: java php android json retrofit2

我不明白其中的区别,我编写了一个示例,我的应用程序使用retrofit2使用POST请求向服务器发送用户名和密码。

我首先尝试在接口方法中使用@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);
   }

?>

有人可以解释有什么区别,如何解决?

1 个答案:

答案 0 :(得分:5)

@Body - 将Java对象作为请求体发送。

@Field - 以form-urlencoded格式发送数据。 @Field参数仅适用于POST。

为了在php中读取POST json body,您可以使用以下代码:

//Get the request body
$inputJSON = file_get_contents('php://input');
//Convert into array
$input = json_decode($inputJSON, TRUE);

$username = $input['username'];
$password = $input['password'];