10

私は長い間 Retrofit を使用してきましたが、この大規模な更新の後、少し難しくなりました :) 私の問題は、base64 でエンコードされた画像内で formUrlEncoded としてポスト リクエストを送信する必要があることです。

画像がなければ、以下のリクエストは問題なく機能します

@FormUrlEncoded
@POST("mypath")
Call<BooleanResponse> updateUser(@FieldMap HashMap<String, String> updatedValues);

しかし、Base64でエンコードされた画像を含めようとすると、内部サーバーエラーが発生します.HttpPostでこのサービスを呼び出す別のアプリケーションがあり、正常に動作するため、サーバー側に関するものではないことがわかります。

これは、画像からbase64データを取得する方法であり、これをマップに追加して、updateUserリクエストにも渡しますが、うまくいきません。

public static String getProfileImage(ImageView imageView) {
    imageView.buildDrawingCache();
    Bitmap bm = imageView.getDrawingCache();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.JPEG, 40, baos);
    byte[] b = baos.toByteArray();
    return Base64.encodeToString(b, Base64.DEFAULT);
}

私が検索したとき、私がそうしないように言わない限り、Retrofit は Gson を介して要求に応じていくつかのシリアル化を使用することがわかりました! この質問のように

しかし、Retrofit2 のように配置する方法がわかりませんでした。何か提案はありますか?

4

1 に答える 1

5

解決策を見つけました。以下のように更新されたサービスリクエスト

@POST("mypath")
Call<BooleanResponse> updateUser(@Body RequestBody updatedBody);

そして、updatedValues マップから RequestBody オブジェクトを作成し、代わりに上記のリクエストを使用しました。

FormBody.Builder bodyBuilder = new FormBody.Builder();
Iterator it = changedFieldsMap.entrySet().iterator();
while (it.hasNext()) {
      Map.Entry pair = (Map.Entry) it.next();
      bodyBuilder.add((String) pair.getKey(), (String) pair.getValue());
      it.remove(); // avoids a ConcurrentModificationException
}
RequestBody requestBody = bodyBuilder.build();
serviceManager.updateUser(requestBody);
于 2016-02-01T14:30:18.397 に答える