web-dev-qa-db-ja.com

レトロフィット-@Bodyパラメーターは、フォームまたはマルチパートエンコーディングでは使用できません

Header、フォームでエンコードされたフィールド、およびJSONボディを含めるリクエストを作成しようとしています。私のレトロフィットインターフェースは次のとおりです

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

このリクエストを行うと、例外が返されます@Bodyパラメータは、フォームまたはマルチパートエンコーディングでは使用できません。
私も@Multipart注釈:

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

IllegalArgumentExceptionを取得し、許可されるエンコーディングアノテーションは1つだけです。

41
Chris

この投稿は私に正しい方向を示していました https://stackoverflow.com/a/21423093/1446856 。本体にすべてを添付し、TypedInputとして送信します。
したがって、インターフェースは次のようになります

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

体はこんな感じ

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

多分これは何人かの人々を助けるかもしれません、もしあなたがこの問題を抱えているなら、あなたはインターフェースの@ FormUrlEncodedをすべきです。お役に立てれば。

70
Julien Athomas

にフィールドを追加することでこの問題を解決しました

@POST("/api/register") 

このような:

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

それは良い解決策ではありませんが、役に立つかもしれません。

1
Matt.Young

Json Bodyを含む認証ヘッダーをKotlinのAPIサンプルコードに送信します。

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