2013-09-20 7 views
5

Я ранее использовал Square чрезвычайно Дооснащения успешна для API вызова @GET веба, но при попытке отправить JSON как @BODY в @POST вызова на сервере (Rails) JSON отображается как параметр, а не запрос тела.дооснащения @body показ в качестве параметра в запросе HTTP

Я понимаю, что @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); 

ответ

12

Оказывается, что если вы хотите 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 
); 
+0

Как вы асинхронную версию этого? Когда я добавляю обратный вызов, я получаю исключение - http://stackoverflow.com/questions/22572301/retrofit-throwing-illegalargumentexception-exception-for-asynchronous-formurlenc – Rickster

+0

@Rickster Я подозреваю, что ваша проблема связана с вашим '@ DELETE', но я не знаком с этим - я только что делал вызовы @ @ GET' и '@ POST'. Мой асинхронный вызов редактируется выше. – saywhatnow

+0

Отличный ответ. Странно, однако, что вы не можете сделать '@Body String param_name', но вам нужно выполнить' @Field ("param") String param_name' и перед '@ POST' вам нужно аннотировать' @ FormUrlEncoded';), но потому что это идеальное решение, я в порядке с этим. Спасибо! – virusss8