2016-06-14 4 views
10

Я пытаюсь сделать запрос POST с использованием модификации 2. Тип запроса: form-dataNOTapplication/x-www-form-urlencoded.Модернизация 2 только с данными формы

Я только отправляю данные, а не файлы в запросе, а ответ - в форме JSON.

Я пробовал @FormUrlEncoded, @Multipart, но он не работает.

Я попытался после запроса

1. Первая попытка

@FormUrlEncoded 
@POST("XXXX") 
Call<PlanResponse> getPlanName(@Field(Constants.ACTION_ID) String actionId, @Field(Constants.OFFER_CODE) String offerCode); 

2. Вторая попытка

@Headers({"Content-Type: multipart/form-data","Content-Type: text/plain"}) 
@FormUrlEncoded 
@POST("XXXX") 
Call<PlanResponse> getPlans(@Body @FieldMap(encoded = false) Map<String, String> data); 

3. Третья попытка

@Headers("Content-Type: multipart/form-data") 
@Multipart 
@POST("XXXX") 
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) String actionId, @Part(Constants.OFFER_CODE) String offerCode); 

Я получаю только тело null. Он работает с POSTMAN.

Я также поиск о form-data и application/x-www-form-urlencoded и обнаружили, что, если данные в двоичном затем использовать form-data и если данные ASCII, то используйте application/x-www-form-urlencoded

Я пытаюсь найти Является ли форма-данные не поддерживаются Модернизированный ?

запрос POSTMAN

Cache-Control: no-cache 
Postman-Token: XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX 
Content-Type: multipart/form-data; boundary=---- WebKitFormBoundaryXXXXXXXXXXXX 


----WebKitFormBoundaryXXXXXXXXXXXX 
Content-Disposition: form-data; name="actionId" 

1000 
----WebKitFormBoundaryXXXXXXXXXXXX 
Content-Disposition: form-data; name="offerCode" 

MYCODE 
----WebKitFormBoundaryXXXXXXXXXXXX 

Я могу только добавить HTTP сгенерированного кода надрезается из POSTMAN

+0

'multipart/form-data' поддерживается. Обычно он используется только тогда, когда полезная нагрузка запроса велика - как в случае с загрузкой файлов, например. – gldraphael

+0

Как ваш backend не способен обрабатывать urlencoded? – njzk2

+0

@gldraphael Итак, что мне здесь не хватает? Я попробовал 3 попытки и все дал мне пустой ответ. Я чувствую, что все правильно. –

ответ

20

В модификации 2.0 для выполнения POST запроса, как и выше, вы должны использовать тип RequestBody для параметра, как это.

@Multipart 
@POST("XXXX") 
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) RequestBody actionId, @Part(Constants.OFFER_CODE) RequestBody offerCode); 

И вот как получить запросBody от String.

String somevalue = "somevalue"; 
RequestBody body = RequestBody.create(MediaType.parse("text/plain"), somevalue); 
+0

Ваш ответ правильный, хотя я отредактировал ваш ответ для некоторой коррекции '@Part (Constants.OFFER_CODE) RequestBody offerCode'. –

+0

Спасибо, что спасли день. – krisDrOid

+0

Я пробовал запрос POST с использованием Retrofit 2., а тип запроса - данные формы. пробовал использовать '@Field, @Query, @ Body'. Но '@ Part' с RequestBody был. Благодаря! –