Retrofit2 Опубликовать снимок как base64

Я давно использую Retrofit, но после этого огромного обновления это было немного сложно 🙂 Моя проблема в том, что мне нужно отправить почтовый запрос как formUrlEncoded в кодировке изображения base64.

Без изображения, запрос ниже работает просто отлично

@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, какие-либо предложения?

Я нашел решение. Обновленный запрос службы, как показано ниже

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

И создал объект RequestBody из map updatedValues ​​и вместо этого использовал вышеуказанный запрос.

 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);