使用Retrofit发送POST请求时无法获取POST参数

时间:2015-12-14 18:47:31

标签: java php rest post retrofit

我正在使用Retrofit 2.0.0向我的REST API发送POST请求。

private class AuthTask extends AsyncTask<String, String, String> {
    protected String doInBackground(String... params) {
        Call<Auth> call = service.auth(params[0], params[1]);
        try {
            Auth authResponse = call.execute().body();
            Log.i(AuthActivity.class.getName(), authResponse.public_key);
        } catch (IOException ex) {
            Log.e(AuthActivity.class.getName(), "Error.");
            return "error";
        }
        return "success";
    }

    protected void onPostExecute(String result) {
        Log.i(AuthTask.class.getName(), "Done");
    }
}
public class Auth {
    public String public_key;
}
public interface AuthService {
    @FormUrlEncoded
    @POST("auth")
    Call<Auth> auth(@Field("username") String username, @Field("publickey") String publickey);
}

以下是请求的日志输出:

12-14 19:36:54.014 30318-30373/com.app D/OkHttp: --> POST /auth HTTP/1.1
12-14 19:36:54.014 30318-30373/com.app D/OkHttp: username=ghtbznz&publickey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCedhOhP9MgYufDxPKH1DdtJiBBdBtbsUy8R7kg%0AWm1Edm7c3ThToMxMgjvOAsHn8rP1Ka1eVN34hC4HV2%2BoomRaWH25WbunN9ZVRqBnowsTOd40eEKh%0A6dsO8Cl3u65VsArDyZyEQa7Ofx29i2juOpWRG%2F6tp9FVnJzZt5dBDkWOKwIDAQAB%0A
12-14 19:36:54.014 30318-30373/com.app D/OkHttp: --> END POST (256-byte body)

以下是响应的日志输出:

12-14 19:42:20.358 2549-2804/com.app D/OkHttp: <-- HTTP/1.1 200 OK (1790ms)
12-14 19:42:20.358 2549-2804/com.app D/OkHttp: Date: Mon, 14 Dec 2015 18:42:16 GMT
12-14 19:42:20.358 2549-2804/com.app D/OkHttp: Server: Apache/2.2.22 (Debian)
12-14 19:42:20.358 2549-2804/com.app D/OkHttp: Vary: Accept-Encoding
12-14 19:42:20.358 2549-2804/com.app D/OkHttp: Keep-Alive: timeout=5, max=99
12-14 19:42:20.366 2549-2804/com.app D/OkHttp: Connection: Keep-Alive
12-14 19:42:20.366 2549-2804/com.app D/OkHttp: Content-Type: text/html
12-14 19:42:20.366 2549-2804/com.app D/OkHttp: OkHttp-Selected-Protocol: http/1.1
12-14 19:42:20.366 2549-2804/com.app D/OkHttp: OkHttp-Sent-Millis: 1450118540088
12-14 19:42:20.366 2549-2804/com.app D/OkHttp: OkHttp-Received-Millis: 1450118540358
12-14 19:42:20.373 2549-2804/com.app D/OkHttp:  
12-14 19:42:20.373 2549-2804/com.app D/OkHttp:  
12-14 19:42:20.373 2549-2804/com.app D/OkHttp:  
12-14 19:42:20.373 2549-2804/com.app D/OkHttp: array(0) {
12-14 19:42:20.373 2549-2804/com.app D/OkHttp: }
12-14 19:42:20.373 2549-2804/com.app D/OkHttp: Notice: Undefined index: username in /home/auth/index.php on line 45
12-14 19:42:20.373 2549-2804/com.app D/OkHttp: Notice: Undefined index: publickey in /home/auth/index.php on line 46
12-14 19:42:20.373 2549-2804/com.app D/OkHttp: <-- END HTTP (251-byte body)

在我的PHP文件中,这是我检索POST参数的方式:

$user = $_POST["username"];
$pk = $_POST["publickey"];

奇怪的是,当我使用CURL发送POST请求时,一切正常。所以我的问题是为什么我无法使用Retrofit发送正确的POST参数?

2 个答案:

答案 0 :(得分:2)

Retrofit可能像Angular一样,数据被发布为mime-type“application / json”而不是“application / x-www-form-urlencoded”或“multipart / form-data”。如果数据为“application / json”,PHP将不会将数据解析为$ _POST。所以,你必须自己动手。我这样做......

<div class="container">
      <div class="table1">
         Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      </div>
      <div class="table2">
         Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      </div>
      <div class="table3">
         Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      </div>
   </div>

答案 1 :(得分:1)

我在Android手机上安装了应用程序Shark并嗅探了流量。最后,我发现重定向发生(301)因此,所有POST参数都消失了。

解决方案非常简单。只需在REST端点后添加斜杠:

public interface AuthService {
    @FormUrlEncoded
    @POST("auth/")
    Call<Auth> auth(@Field("username") String username, @Field("publickey") String publickey);
}
相关问题