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.
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")));
vielleicht könnte dies einigen Leuten helfen. Wenn Sie dieses Problem haben, sollten Sie @FormUrlEncoded entfernen von Ihrer Benutzeroberfläche entfernen .. _. Hoffe, das hilft.
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.
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>