2016-01-29 2 views
9

Я давно пользуюсь Retrofit, но после этого огромного обновления это было немного сложно :) Моя проблема в том, что мне нужно отправить запрос на отправку как formUrlEncoded в кодировке с изображениями base64.Retrofit2 Post image as 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); 
} 

Как я искал, я нашел, что дооснащения использовать некоторые сериализации по запросу через Gson, если я не скажу это не делать этого! As in this question

Но я не мог понять, как сказать, как в Retrofit2, любые предложения?

+0

Вы хотите разместить Base64 в качестве поля формы/параметра? или в теле? –

+0

как форма параметр @ VaibhavA.Jani – yahya

+0

Проблема может быть вашей "Base64 String" будет UrlEncoded попробовать декодировать его на сервере. ИЛИ инкапсулируйте его в «POJO (простой Java-объект)», поэтому он будет отправлен как поле Json внутри объекта Json и будет правильно сериализован. TypedString удаляется из Retrofit2! –

ответ

4

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

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

И создал объект RequestBody с обновленной карты Values ​​и использовал использованный выше запрос.

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

, можете ли вы объяснить, что такое скомпилированный файл changedFieldsMap? Где вы помещаете строковое изображение base64? –