使用 Retrofit 2.0 发布二进制数据的正确方法

Mic*_*ael 6 android retrofit2

我最近从使用 Retrofit 1.9 转向使用 Retrofit 2,并且在发布二进制数据时遇到问题。

当我使用 Retrofit 1.9 时,我能够发送一个TypedByteArray包含byte[]数据@Body的请求。最接近的等价物TypedByteArray似乎是RequestBody,我使用如下:

final ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
thumbnail.compress(Bitmap.CompressFormat.JPEG, 5, byteOutputStream);
final byte[] thumbnailBytes = byteOutputStream.toByteArray();
final RequestBody thumbnailRequestBody = RequestBody.create(MediaType.parse("image/jpeg"), thumbnailBytes);
Run Code Online (Sandbox Code Playgroud)

生成请求的代码如下:

Headers("Content-Type: image/jpeg")
@POST("/thumbnail")
Call<Void> uploadThumbnail(@Body RequestBody thumbnailContent);
Run Code Online (Sandbox Code Playgroud)

但是,似乎 Retrofit 可能试图将 解析RequestBody为 JSON 对象,因为实际发送到服务器的数据是{}.

任何有关如何正确发布二进制数据的建议或指导将不胜感激。谢谢。

Ank*_*wal 1

像这样创建您的请求

Headers("Content-Type: image/jpeg")
@POST("/thumbnail")
@Multipart
Call<Void> uploadThumbnail(@Part RequestBody thumbnailContent);
Run Code Online (Sandbox Code Playgroud)

像这样称呼它

File partFile = <your_stream_as_file>;
RequestBody fbody = RequestBody.create(MediaType.parse("image"), partFile);
uploadThumbnail(fbody);
Run Code Online (Sandbox Code Playgroud)

  • 该错误现已由 @sapht 修复,但在将来:如果您的答案需要更正,请单击问题的“编辑”链接并修复它。评论是一个可以说“哎呀,需要将 X 更改为 Y,现在已经完成”的地方,而不是“有人可以将 X 更改为 Y 吗?” (2认同)