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
:
- Convertidor de gson retrofit para json anidado con diferentes objetos
- Java.lang.NoClassDefFoundError: io.reactivex.Observable
- Obtenga un objeto json simple usando retrofit 2
- Manejo de errores personalizados con Retrofit cuando se ofusca usando proguard da java.lang.reflect.UndeclaredThrowableException
- RXJava cómo tratar de conseguir después de x tiempo
@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.
- Retrofit 2.0 lanzando "IllegalArgumentException: los parámetros @Field solo se pueden usar con la codificación de formularios". ¿Cómo hacer la consulta correcta de la API y arreglarlo?
- Java.lang.IllegalStateException: Se esperaba BEGIN_ARRAY pero era BEGIN_OBJECT en la línea 1 de la columna 2
- Mock Retrofit Observable <T> respuesta en las pruebas de la unidad Android
- Javax.net.ssl.SSLHandshakeException: Handshake falló en Android 5.0.0 cuando SSLv2 y SSlv3 están deshabilitados (sólo TLS) (y mayores)
- Java.lang.NoClassDefFoundError: Resolución fallida de: Lretrofit2 / GsonConverterFactory;
- Cómo obtener malformado JSON en Retrofit 2
- Observer.onError disparando de manera incoherente
- POST cuerpo JSON utilizando Retrofit
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.
- Manejo de bases de datos con 2 procesos
- Está utilizando Fragment's setRetainInstance (true) realmente una buena práctica para manejar el cambio de rotación