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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:01