如何使用Spring WebClient解析返回的multipart/form-data响应体?
WebClient解析multipart/form-data响应实现方案
BodyExtractors.toMultipartData() 并不限制仅在Controller层使用,完全可以直接用于WebClient的multipart/form-data格式响应解析,无需单独开发自定义实现。
基础使用示例
Spring 5.3及以上版本无需额外配置,直接在WebClient响应处理阶段调用即可:
// 非阻塞场景下可替换block()为subscribe、flatMap等响应式操作符 MultiValueMap<String, Part> multipartResult = webClient.post() .uri("请求接口地址") .retrieve() .body(BodyExtractors.toMultipartData()) .block();
注意:如果目标接口返回的
Content-Type响应头未携带合法的boundary参数,会导致解析失败,需要确认服务端返回的响应头符合multipart格式规范,或手动在WebClient的响应处理阶段修正Content-Type值。
低版本兼容配置
如果使用的Spring版本低于5.3,或者默认配置下出现multipart格式识别失败的问题,可手动注册Multipart消息读取器到WebClient的编解码器配置中:
WebClient webClient = WebClient.builder() .codecs(codecConfigurer -> { // 注册multipart格式专属消息读取器 DefaultPartHttpMessageReader partReader = new DefaultPartHttpMessageReader(); MultipartHttpMessageReader multipartReader = new MultipartHttpMessageReader(partReader); codecConfigurer.customCodecs().register(multipartReader); }) .build();
单个Part内容读取示例
解析得到的MultiValueMap<String, Part>中存储了所有multipart分段内容,可按需读取对应字段:
- 读取普通文本类型的表单字段:
Part textPart = multipartResult.getFirst("表单字段名"); String textValue = DataBufferUtils.join(textPart.content()) .map(buffer -> buffer.toString(StandardCharsets.UTF_8)) .block();
- 读取文件类型的分段内容:
Part filePart = multipartResult.getFirst("文件字段名"); // 示例:将文件内容写入本地磁盘 Path savePath = Paths.get("本地存储路径"); DataBufferUtils.write(filePart.content(), savePath, StandardOpenOption.CREATE) .block();
内容的提问来源于stack exchange,提问作者kemenov
相关产品推荐
相关产品推荐

