如何正确执行返回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
相关产品推荐
相关产品推荐

