简体   繁体   English

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

[英]Can not get POST parameters when sending POST request with Retrofit

I am using Retrofit 2.0.0 to send POST request to my REST API. 我正在使用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);
}

Here is my log output for the request: 这是我的请求的日志输出:

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)

And here is the log output for the response: 这是响应的日志输出:

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)

In my PHP-file, this is how I retrieve the POST parameters: 在我的PHP文件中,这是我检索POST参数的方式:

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

The strange thing is, when I use CURL to send the POST request everything works. 奇怪的是,当我使用CURL发送POST请求时,一切正常。 So my question is why am I not able to send the proper POST parameters with Retrofit? 所以我的问题是为什么我无法使用Retrofit发送正确的POST参数?

Retrofit may be like Angular in that the data is POSTed as mime-type "application/json" and not "application/x-www-form-urlencoded" or "multipart/form-data". 改造可能像Angular一样,数据被发布为mime类型的“application / json”而不是“application / x-www-form-urlencoded”或“multipart / form-data”。 PHP will not parse data into $_POST if it is "application/json". 如果数据为“application / json”,PHP将不会将数据解析为$ _POST。 So, you gotta do it your self. 所以,你必须自己动手。 I do something like this ... 我这样做......

if (isset($_SERVER['CONTENT_TYPE'])
    and stripos($_SERVER['CONTENT_TYPE'], 'application/json') !== false
) {
    $jsonEncoded = file_get_contents('php://input');
    $jsonDecoded = json_decode($jsonEncoded, true);
    if (is_array($jsonDecoded)) {
        foreach ($jsonDecoded as $varName => $varValue) {
            $_POST[$varName] = $varValue;
        }
    }
}

I installed the application Shark on my Android phone and sniffed the traffic. 我在我的Android手机上安装了应用程序Shark并嗅探了流量。 Finally, I found out that a redirect occurs (301) and therefore, all the POST parameters are gone. 最后,我发现重定向发生(301)因此,所有POST参数都消失了。

The solution is very simple. 解决方案非常简单。 Just add a slash after the REST endpoint: 只需在REST端点后添加斜杠:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM