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.