【问题标题】:Why Retrofit2 works with @Field and not @Body for POST requests为什么 Retrofit2 与 @Field 而不是 @Body 一起用于 POST 请求
【发布时间】:2017-06-09 08:40:59
【问题描述】:

我不明白其中的区别,我编写了一个示例,其中我的应用程序使用 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);
   }

?>

有人能解释一下有什么区别以及如何解决吗?

【问题讨论】:

    标签: java php android json retrofit2


    【解决方案1】:

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

    【讨论】:

    • 无论如何我可以检查file_get_contents('php://input') 是否接收到数据,以及如何确保每次点击 url 时都不会调用此方法。我对此很陌生,因此将不胜感激,谢谢。
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2021-08-21
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多