volley implementar ejemplo consumir android api retrofit square

android - implementar - retrofit post



Retrofit-Los parámetros de @Body no se pueden usar con la codificación de formulario o de varias partes (3)

Estoy intentando hacer una solicitud en la que quiero incluir un encabezado, un campo urlencoded y un cuerpo json. La interfaz de mi Retrofit es la siguiente

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

Cuando realizo esta solicitud, recibo una excepción. @Body parámetros de @Body no se pueden usar con la codificación de formulario o de varias partes.
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.


Esta publicación me indicó la dirección correcta https://.com/a/21423093/1446856 . TypedInput todo en el cuerpo y lo envié como un TypedInput .
Entonces la interfaz se ve algo como 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 ve algo como 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.


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