Retrofit – Los parámetros de @Body no se pueden usar con codificación de formularios o multipartes

Estoy tratando de hacer una solicitud en la que quiero incluir un encabezado, un formulario de urlencoded campo y un cuerpo json. Mi interfaz de Retrofit es la siguiente

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

Cuando hago esta petición vuelvo la excepción los parámetros de @Body no se pueden utilizar con la forma o la codificación multi-part.
También he intentado con la anotación @Multipart :

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

Y obtengo una IllegalArgumentException y solo se permite una anotación de codificación.

Tal vez esto podría ayudar a algunas personas, si tiene este problema, debe quitar @FormUrlEncoded de su interfaz. Espero que esto ayude.

Este post me señaló a la dirección correcta https://stackoverflow.com/a/21423093/1446856 . Adjunto todo en el cuerpo y enviarlo como un TypedInput .
Así que la interfaz se parece a esto

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

Y el cuerpo se parece a esto

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

Resolví este problema agregando el campo en

 @POST("/api/register") 

Me gusta esto:

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

No es una buena solución, pero puede ser útil.

  • Ajustar la variable json del mapa a la palabra clave
  • Retrofit 2.0 + RxJava + Error JSON cuerpo
  • Subir una imagen a Google appengine utilizando Robospice con Retrofit
  • Encadenar dos observables de adaptación con RxJava
  • Cómo crear NTLM Authentification con Retrofit
  • AbstractMethodError cuando se utiliza RxJavaCallAdapterFactory en Retrofit 2
  • Cargue archivos en el cubo AWS S3 usando OkHttp o Retrofit
  • Retrofit + RxJava no puede almacenar en caché las respuestas, los encabezados de respuesta sospechados
  • RxJava reintentoCuando vuelve a suscribir la propagación
  • Uso de Mockito con Retrofit 2.0
  • Retrofit: Se esperaba BEGIN_OBJECT pero era BEGIN_ARRAY
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.