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
相关产品推荐
相关产品推荐

