Retrofit2将图片发布为base64

时间:2016-01-29 12:54:03

标签: android image gson retrofit retrofit2

我一直在使用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的要求使用一些序列化,除非我告诉它不要这样做! As in this question

但我无法弄清楚如何将其作为Retrofit2,任何建议?

1 个答案:

答案 0 :(得分: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);