Retrofit @Body отображается как параметр в HTTP-запросе

Ранее я успешно использовал Retrofit Square для вызова веб-API @GET, но при попытке отправить JSON в качестве @BODY в вызове @POST на сервере (Rails) JSON отображается как параметры, а не запрос тела.

Насколько я понимаю, @BODY добавит этот параметр метода к запросу в теле.

Любая идея, что я делаю неправильно?

WebApi:

@POST("/api/v1/gear/scans.json")
Response postScans(
    @Header(HEADER_AUTH) String token,
    @Body JsonObject scans
);

Сделать веб-запрос:

RestAdapter restAdapter = new RestAdapter.Builder()
    .setServer(api_url)
    .build();
WebApi webApi = restAdapter.create(AssetsWebApi.class);     
Response response = webApi.postScans(auth_token, valid_json);

person saywhatnow    schedule 20.09.2013    source источник


Ответы (1)


Оказывается, если вы хотите отправить данные POST как часть тела запроса, вам нужно аннотировать метод интерфейса API как @FormUrlEncoded и передать содержимое тела как @Field, как показано ниже:

@FormUrlEncoded
@POST("/api/v1/gear/scans.json")
Response postScans(
    @Header(HEADER_AUTH) String token,
    @Field("scans") JsonArray scans
);

Асинхронный вызов @Rickster:

@POST("/api/v1/gear/scans.json") 
void postScans(
    @Header(HEADER_AUTH) String token,
    @Body JsonObject scans,
    Callback<PostSuccessResponseWrapper> callback
);
person saywhatnow    schedule 20.09.2013
comment
Как вы делаете асинхронную версию этого? Когда я добавляю обратный вызов, я получаю исключение - асинхронная форма "> stackoverflow.com/questions/22572301/ - person Rickster; 22.03.2014
comment
@Rickster Я подозреваю, что ваша проблема связана с вашей аннотацией @DELETE, но я не знаком с этим - я когда-либо делал только звонки @GET и @POST. Мой асинхронный вызов отредактирован выше. - person saywhatnow; 24.03.2014
comment
Отличный ответ. Странно, однако, что вы не можете сделать @Body String param_name, но вместо этого вы должны сделать @Field("param") String param_name, а перед @POST вам нужно аннотировать @FormUrlEncoded ;) но поскольку это идеальное решение, я согласен с этим. Спасибо! - person virusss8; 25.03.2015