web-dev-qa-db-fra.com

Retrofit - Les paramètres @Body ne peuvent pas être utilisés avec le codage de formulaire ou en plusieurs parties

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. 

36
Chris

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")));
13
Chris

peut-être que cela pourrait aider certaines personnes, si vous avez ce problème, vous devriez supprimer @FormUrlEncoded de votre interface .

56
Julien Athomas

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.

1
Matt.Young

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>
0
Hamed Jaliliani