Использую Retrofit2, хочу отправить на сервер POST параметры.
public interface ServerApi {
@GET("Singleton")
Call<String> getJSON();
@POST("Singleton")
Call<String> senDDudes(@Query("author") String author);
}
Использую этот интерфейс для отправки данных. При заходе на сервер данные получаются в POST формате, а потом возвращаются в JSON формате.
Retrofit rt;
rt=new Retrofit.Builder().baseUrl("http://10.0.2.2/").addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();
ServerApi sapi=rt.create(ServerApi.class);
Call<String> msg=sapi.senDDudes("Dude","bude");
msg.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
System.out.println(response.body().toString());
}
@Override
public void onFailure(Call<String> call, Throwable t) {
System.out.println(t.toString());
}
});
Проблема в том, что данные в виде POST не приходят на сервер. Возврат есть, а вот приема нет. Проверяю с помощью echo $_POST['author'] на самом сервере.
НО если я использую вместо аннотации @POST аннотацию @GET, и вывожу соответственно echo $_GET['author'], данные выводятся.
В Retrofit я новичок, поэтому учитывайте пожалуйста это.
Параметр с аннотацией @Query управляет параметрами query запроса (как ни странно). Поэтому в php вы этот параметр можете достать с помощью $_GET (как известно, GET запрос не имеет тела, и логично что параметры запроса достаются из query url-a).
Чтобы отправить тело с POST-запросом:
interface Foo {
// Вся соль здесь
@POST("/path")
FooResponse postJson(@Body FooRequest body);
}
Класс десериализованного тела запроса:
public class FooRequest {
final String foo;
final String bar;
FooRequest(String foo, String bar) {
this.foo = foo;
this.bar = bar;
}
}
Делаете запрос:
FooResponse = foo.postJson(new FooRequest("kit", "kat"));
Сборка персонального компьютера от Artline: умный выбор для современных пользователей