2014-12-05 2 views
28

Я пытаюсь сделать запрос, в который я хочу включить заголовок, поле формы и urlencoded и тело json. Мой интерфейс дооснащения выглядит следующим образомRetrofit - параметры @Body нельзя использовать с формой или многочастной кодировкой

@FormUrlEncoded 
@POST("/api/register") 
Observable<RegisterResponse> register(
    @Header("Authorization") String authorization, 
    @Field("grant_type") String grantType, 
    @Body RegisterBody body 
); 

Когда я делаю этот запрос я получаю обратно исключение @Body параметры не могут быть использованы с формой или нескольких частей кодирования.
Я также попытался с @Multipart аннотацию:

@Multipart 
@FormUrlEncoded 
@POST("/api/register") 
Observable<RegisterResponse> register(
    @Header("Authorization") String authorization, 
    @Part("grant_type") TypedString grantType, 
    @Body RegisterBody body 
); 

и я получаю IllegalArgumentException и только одна кодировка аннотаций допускается.

+0

Возможный дубликат [Многостраничный запрос с использованием Retrofit 1.8.0 не работает] (http://stackoverflow.com/questions/21582453/multipart-request-using-retrofit-1-8-0-not-working) – njzk2

+1

также , так как это мультипартик, вам нужно несколько @Part, а не тело и часть – njzk2

ответ

10

Это сообщение направило меня в нужном направлении https://stackoverflow.com/a/21423093/1446856. Я прикрепил все в теле и отправлю его как TypedInput.
Так выглядит интерфейс что-то вроде этого

@POST("/api/register") 
@Headers({ "Content-Type: application/json;charset=UTF-8"}) 
Observable<RegisterResponse> register(
    @Header("Authorization") String authorization, 
    @Body TypedInput body 
); 

и тело выглядит что-то вроде этого

String bodyString = jsonBody + "?grant_type=" + 
    grantType + "&scope=" + scope; 
TypedInput requestBody = new TypedByteArray(
    "application/json", bodyString.getBytes(Charset.forName("UTF-8"))); 
+0

, каково значение для 'jsonBody'? – ViksaaSkool

+0

@ViksaaSkool это может быть любая строка json. например, «валюта»: «GBP», «customerId»: 2, «страна»: «GB», «lang»: «en-GB», «sizeSchema»: «UK», «store»: «1», } – Chris

+1

Это не работает в Retrofit 2, мы должны использовать RequestBody !! –

29

может быть, это может помочь некоторым людям, если у вас есть эта проблема, вы должны удалить @FormUrlEncoded вашего интерфейса. Надеюсь, это поможет.

+1

Это сработало как шарм .. Спасибо @Julien –

+0

Кто-то спас день :) спасибо – Sam

1

Я решил эту проблему путем добавления поля в

@POST("/api/register") 

как это:

@POST("/api/register?grantType=value") 

это не является хорошим решением, но может быть полезным.

Смежные вопросы