я использую модифицировать 2.0.0 для отправки запроса POST в мой REST API.
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, все работает. Поэтому мой вопрос: почему я не могу отправить правильные параметры POST с помощью Retrofit?
Модификация может быть похожа на Angular в том, что данные POST представлены как mime-тип «application / json», а не «application / x-www-form-urlencoded» или «multipart / form-data». PHP не будет анализировать данные в $ _POST, если это «application / json». Итак, ты должен сделать это сам. Я делаю что-то вроде этого …
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;
}
}
}
Я установил приложение Shark на свой телефон Android и понюхал трафик. Наконец, я обнаружил, что происходит перенаправление (301), и поэтому все параметры POST пропали.
Решение очень простое. Просто добавьте косую черту после конечной точки REST:
public interface AuthService {
@FormUrlEncoded
@POST("auth/")
Call<Auth> auth(@Field("username") String username, @Field("publickey") String publickey);
}