Intereting Posts
Как передавать аудио с одного устройства Android на другое устройство Android Через Bluetooth? Как создать панель инструментов (например, вторичную панель действий) в Android? Как получить контакты в порядке их предстоящих дней рождения? Отключить возможности уведомлений для библиотек Приложение на базе библиотеки устанавливает 2 файла APK, а не одно – Почему? Android GUI-архитектура – отношение между поверхностью / представлением / окном / холстом Android-версия релиза не zipaligning Есть ли разумный способ ссылаться на ресурсы приложений (R.string …) в статических инициализаторах Есть ли список разрешений экрана для всех Android-телефонов и планшетов на базе Android? Заголовок маркера Android Google на арабском языке, показывающий пробел Android.content.ActivityNotFoundException: Невозможно найти явный класс активности DrawerLayout с NavigationView – не показывает эффект пульсации при нажатии Android – «Сервер не смог обработать ваш apk. Повторите попытку .. "при загрузке на рынок Android конвертирует центральное время в локальное время Установить цвет области TextView в Android

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