【问题标题】:Retrofit2 Post image as base64Retrofit2 将图像发布为 base64
【发布时间】:2016-05-07 05:18:46
【问题描述】:

我已经使用 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 中,有什么建议吗?

【问题讨论】:

  • 您想将 Base64 作为表单字段/参数发布吗?还是在正文中?
  • 作为表单参数@VaibhavA.Jani
  • 问题可能是您的“Base64 字符串”将被 UrlEncoded 尝试在服务器端对其进行解码。或将其封装在“POJO(plain java object)”中,以便将其作为 Json 对象中的 Json 字段发送并正确序列化。 TypedString 已从 Retrofit2 中移除!
  • 但我无法更改 Web 服务结构,它必须像 urlEncoded 表单字段一样:(@VaibhavA.Jani
  • 您有权访问服务器日志吗?如果是,请发布错误消息

标签: android image gson retrofit retrofit2


【解决方案1】:

我找到了解决方案。更新服务请求如下

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

【讨论】:

  • 你能解释一下changedFieldsMap的内容吗?你把base64字符串图片放在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2018-04-02
  • 2018-06-26
  • 2016-04-30
  • 2021-08-06
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多