webentwicklung-frage-antwort-db.com.de

Retrofit - @Body-Parameter können nicht mit der Codierung von Formaten oder Mehrkomponenten verwendet werden

Ich versuche eine Anfrage zu stellen, in der ich einen Header, ein Formular-urlencoded-Feld und einen Json-Body enthalten möchte. Meine Retrofit-Schnittstelle sieht wie folgt aus 

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

Wenn ich diese Anfrage stelle, erhalte ich eine Ausnahme. @Body-Parameter können nicht mit der Codierung von Formularen oder Mehrkomponenten verwendet werden.
Ich habe auch die Annotation @Multipart ausprobiert:

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

und ich bekomme eine IllegalArgumentException und nur eine Kodierungsanmerkung ist erlaubt. 

36
Chris

Dieser Beitrag wies mich in die richtige Richtung https://stackoverflow.com/a/21423093/1446856 . Ich habe alles im Körper angehängt und als TypedInput gesendet.
.__ Die Schnittstelle sieht also ungefähr so ​​aus 

@POST("/api/register")
@Headers({ "Content-Type: application/json;charset=UTF-8"})
Observable<RegisterResponse> register(
    @Header("Authorization") String authorization,
    @Body TypedInput body
);

und der Körper sieht so aus 

String bodyString = jsonBody + "?grant_type=" + 
    grantType + "&scope=" + scope;
TypedInput requestBody = new TypedByteArray(
    "application/json", bodyString.getBytes(Charset.forName("UTF-8")));
13
Chris

vielleicht könnte dies einigen Leuten helfen. Wenn Sie dieses Problem haben, sollten Sie @FormUrlEncoded entfernen von Ihrer Benutzeroberfläche entfernen .. _. Hoffe, das hilft.

56
Julien Athomas

Ich habe dieses Problem durch Hinzufügen des Feldes in gelöst 

@POST("/api/register") 

so was:

@POST("/api/register?grantType=value")

es ist keine gute Lösung, kann aber nützlich sein.

1
Matt.Young

Senden Sie den Authentifizierungsheader mit json Body an den API-Beispielcode in Kotlin:

 @POST("/api/user/sendlist/")
    fun callSendJsonListPost(
                      @Header("Authheader") header: String,
                      @Body list: StringBuilder
                      )
        : Observable<EntityModelUserslist>
0
Hamed Jaliliani