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

Java中如何从MediaType.APPLICATION_OCTET_STREAM类型的ResponseEntity读取解码后的byte[]响应?

解决方案:正确获取WS2返回的PDF二进制字节数组

嘿,这个问题我之前也踩过坑!核心问题在于你现在用ResponseEntity<String>来接收二进制数据——PDF是纯二进制格式,用字符串类型去承载它,会因为编码转换直接破坏原始字节结构,肯定拿不到可用的PDF数组。

下面给你两种可行的方案,优先推荐第一种:

方案一:直接接收二进制响应(最优解)

修改WS1调用WS2的代码,把返回类型改成ResponseEntity<byte[]>,跳过字符串编码环节,直接拿到原始字节数组。以Spring的RestTemplate为例,代码示例如下:

// 初始化RestTemplate(如果已经有实例可以直接用)
RestTemplate restTemplate = new RestTemplate();

// 构造请求实体(如果WS2需要请求参数或Header,这里传入对应的HttpEntity即可)
HttpEntity<?> requestEntity = null;

// 调用WS2的Method2,指定响应类型为byte[]
ResponseEntity<byte[]> response = restTemplate.exchange(
    "http://your-ws2-domain/method2", // 替换为WS2的实际接口地址
    HttpMethod.GET, // 改成WS2对应的请求方法(GET/POST等)
    requestEntity,
    byte[].class
);

// 直接从响应体中获取原始PDF字节数组
byte[] pdfByte = response.getBody();

这样拿到的pdfByte就是WS2返回的完整PDF二进制数据,直接拿去处理或上传都不会有问题。

方案二:从已接收的String还原字节(仅应急)

如果因为某些限制你已经用ResponseEntity<String>接收了响应,那只能尝试用单字节编码把字符串还原成字节数组(必须用ISO-8859-1,它不会修改原始字节):

ResponseEntity<String> response = // 你原有的调用代码
// 用ISO-8859-1编码还原字节数组
byte[] pdfByte = response.getBody().getBytes(StandardCharsets.ISO_8859_1);

⚠️ 注意:这种方式非常不推荐!只要中间任何环节编码处理不一致,都会导致PDF文件损坏,所以尽量用方案一。

最后再提个醒:处理PDF、图片这类二进制文件时,一定要用byte[]或流来操作,绝对不要用String承载,避免编码转换带来的不可逆损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:28:14