J'essaie de faire une demande dans laquelle je veux inclure un en-tête, un champ codé avec une forme et un corps json. Mon interface de modernisation est la suivante
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Field("grant_type") String grantType,
@Body RegisterBody body
);
Lorsque je fais cette demande, je récupère des paramètres d'exception @Body
qui ne peuvent pas être utilisés avec le codage de formulaire ou en plusieurs parties.
J'ai aussi essayé avec l'annotation @Multipart
:
@Multipart
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Part("grant_type") TypedString grantType,
@Body RegisterBody body
);
et j'obtiens une IllegalArgumentException
et une seule annotation d'encodage est autorisée.
Ce message m'a orienté dans la bonne direction https://stackoverflow.com/a/21423093/1446856 . J'ai attaché tout ce qui était dans le corps et je l'ai envoyé sous la forme d'une TypedInput
.
L’interface ressemble donc à ceci
@POST("/api/register")
@Headers({ "Content-Type: application/json;charset=UTF-8"})
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Body TypedInput body
);
et le corps ressemble à quelque chose comme ça
String bodyString = jsonBody + "?grant_type=" +
grantType + "&scope=" + scope;
TypedInput requestBody = new TypedByteArray(
"application/json", bodyString.getBytes(Charset.forName("UTF-8")));
peut-être que cela pourrait aider certaines personnes, si vous avez ce problème, vous devriez supprimer @FormUrlEncoded de votre interface .
J'ai résolu ce problème en ajoutant le champ dans
@POST("/api/register")
comme ça:
@POST("/api/register?grantType=value")
ce n'est pas une bonne solution, mais peut être utile.
En-tête d'envoi d'authentification avec un exemple de code json Body to API dans Kotlin:
@POST("/api/user/sendlist/")
fun callSendJsonListPost(
@Header("Authheader") header: String,
@Body list: StringBuilder
)
: Observable<EntityModelUserslist>