web-dev-qa-db-ja.com

@Partパラメータはマルチパートエンコーディングでのみ使用できます。 (パラメーター#8)

ここでこの質問を投稿する前に、インターフェイスメソッドの上に_@Multipart_を追加しようとしました。

この場合、TypedFileを使用して画像をサーバーに送信しようとします。私のインターフェイスメソッドは次のようになります。

_ @Headers({"Content-type: application/json"})
    @POST("/user/change")
    void postChange(@Query("name") String name, @Query("email") String  email, @Query("password") String password, @Query("phone") String phone, @Query("user_id") String userId, @Query("address[]") String[] listAddress, @Query("head[]") String[] head, @Part("photo_profile") TypedFile photoProfile, @Body TypedInput jsonObject, Callback<ReceiveDTO> callback);
_

[〜#〜]編集[〜#〜]

そのメソッドでは、_@Part_および_@Body_を確認できます。メソッドの上に_@Multipart_を追加すると、エラーがスローされます@Body parameters cannot be used with form or multi-part encoding. (parameter #9)

私はRetrofit 1.9を使用しています

11
R Besar

同じ問題が発生する場合は、@ POST/@ PUTの上に@Multipartアノテーションを追加してください。私は同じエラーがあり、私の問題はその注釈が欠けていたことだけでした

17
Miguel Rdz

@ QueryGetリクエストでのみ使用し、実際には@ QueryURLの最後にパラメータを追加します。 Document の例を参照してください。

ユーザープロファイルをサーバーに送信する必要がある場合は、MultiPartを使用します。

マルチパートパーツはRetrofitのコンバーターの1つを使用するか、RequestBodyを実装して独自のシリアル化を処理できます。

たとえば、次のコードでは、説明付きのプロフィール写真をサーバーに送信できます。

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

@Partでさらに属性を追加することもできます。完全な例 here を参照してください。どのようにしてこれを行うかを段階的に説明しました。

Edit:JackWarthonが説明するように here 、The@ Bodyアノテーションは、単一のリクエスト本文を定義します。

interface Foo {
  @POST("/jayson")
  FooResponse postJson(@Body FooRequest body);
}
13
Amir