Retrofit2以base64的形象发布

我一直在使用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); } 

当我search时,我发现Retrofit通过Gson的请求使用一些序列化,除非我告诉它不要这样做! 就像这个问题一样

但我不知道如何把它作为在Retrofit2,有什么build议吗?

Solutions Collecting From Web of "Retrofit2以base64的形象发布"

我find了解决scheme。 更新的服务请求如下

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

并从updatedValues地图创build一个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);