Spring Boot 2 WebClient获取响应Header及UnsupportedMediaTypeException修复
问题原因
你当前代码触发报错的核心原因是:toEntity(MyResponse.class) 方法会强制WebClient将响应体反序列化为指定的MyResponse类型,而你请求的接口返回的是image/tiff这类二进制媒体类型,Spring默认的消息转换器没有配置对应类型到自定义Java类的映射规则,因此直接抛出不支持媒体类型的异常。同时你实际仅需要获取响应头的content-type字段,完全不需要解析响应体,现有写法做了多余的反序列化操作。
修复方案
最简实现(仅需获取响应头)
直接调用toBodilessEntity()方法,该方法不会处理响应体,只会封装响应状态和响应头,完全规避反序列化问题,代码如下:
Mono<String> contentTypeMono = webClient.get() .uri(path) .acceptCharset(StandardCharsets.UTF_8) .retrieve() // 仅解析响应头和状态,不处理响应体 .toBodilessEntity() .map(entity -> entity.getHeaders().getFirst("content-type")); // 阻塞获取结果 String contentType = contentTypeMono.block();
该方案不管接口返回什么类型的内容,都不会触发媒体类型不支持的报错,性能也更高,完全匹配你只需要获取content-type的需求。
兼容场景(需同时获取响应体和响应头)
如果业务需要同时解析响应体内容,可先将响应体以字节数组形式通用接收,再自行封装到自定义类中,示例代码如下:
Mono<MyResponse> responseMono = webClient.get() .uri(path) .acceptCharset(StandardCharsets.UTF_8) .retrieve() // 字节数组适配所有媒体类型,不会触发反序列化报错 .toEntity(byte[].class) .map(entity -> { MyResponse resp = new MyResponse(); resp.setStatus(entity.getStatusCodeValue()); resp.setContentType(entity.getHeaders().getFirst("content-type")); resp.setBody(entity.getBody()); return resp; }); MyResponse rs = responseMono.block();
内容的提问来源于stack exchange,提问作者user2287094
相关产品推荐
相关产品推荐

