You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确执行返回byte[]的Retrofit调用并获取ResponseEntity?

解决Retrofit调用Spring返回ResponseEntity<byte[]> PDF的反序列化问题

问题根源

Retrofit默认依赖Jackson处理序列化/反序列化,但Spring的ResponseEntity是服务端的响应封装类,它没有提供Jackson可识别的无参构造器或属性创建逻辑;更关键的是,服务端实际返回的是纯二进制PDF流,并非ResponseEntity序列化后的JSON结构,直接用Call<ResponseEntity<byte[]>>必然导致Jackson解析失败。

正确解决方案

1. 修改Retrofit接口的返回类型

将接口返回类型改为Call<ResponseBody>,ResponseBody是Retrofit专门用于处理原始响应体(包括二进制数据)的类型:

@Headers("Accept: application/pdf")
@GET("/v1/pdf")
Call<ResponseBody> getPdf(@Query("number") final String number);

注:这里把Content-Type改为Accept更准确,用于告知服务端客户端期望接收的内容类型。

2. 调用接口并处理响应

执行请求后,从ResponseBody中提取字节数组,若需要ResponseEntity可手动构建:

Response<ResponseBody> response = service.getPdf(number).execute();
if (response.isSuccessful()) {
    // 获取PDF字节数组
    byte[] pdfBytes = response.body().bytes();
    
    // 手动封装为Spring ResponseEntity(如果业务需要)
    ResponseEntity<byte[]> pdfEntity = ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF_VALUE)
            .body(pdfBytes);
    
    // 后续业务处理,比如写入文件或返回给前端
} else {
    // 处理请求失败场景
    System.err.println("请求失败,状态码:" + response.code());
}

额外说明

如果坚持要让Retrofit直接返回ResponseEntity,需要自定义Converter来解析响应,但这种做法完全没必要——服务端返回的是纯二进制流,并非ResponseEntity的JSON结构,手动构建ResponseEntity是更简单高效的方案。

内容的提问来源于stack exchange,提问作者Derek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:45:37