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

Spring Boot WebClient默认Headers未生效:原因及修复方法咨询

问题描述

在Spring Boot应用中使用WebClient时遇到异常:通过WebClient.Builder的defaultHeaders方法设置的默认请求头并未应用到实际请求中,必须在每个请求里手动调用header方法添加头信息才能正常请求接口。

以下是设置默认请求头的代码:

public EService() {
this.webClient = WebClient.builder()
        .baseUrl(baseURL)
        .defaultHeaders(header -> {
            header.setContentType(MediaType.APPLICATION_JSON);
            header.set("api-key", apiKey);
        })
        .build();

使用默认请求头发起请求时,会返回400 BadRequest错误,代码如下:

public List<NetworksResponseItemObject> getAllNetworks() {
    List<NetworksResponseItemObject> results = new LinkedList<>();

    try {
        List<NetworksResponseObject> response = webClient.get().uri( orgID + "/hvs")
                .retrieve()
                .bodyToMono(new ParameterizedTypeReference<List<NetworksResponseObject>>() {})
                .block(REQUEST_TIMEOUT);

        for (NetworksResponseObject networksResponseObject : response) {
            results.addAll(networksResponseObject.getNetworks());
        }
    } catch (Exception e) {
        return new LinkedList<>(); //出错时返回空列表
    }
    return results;
}

而删除默认请求头,在每个请求中手动添加头信息则可以正常工作:

public List getAllNetworks() {
List results = new LinkedList<>();

try {
    List<NetworksResponseObject> response = webClient.get()
            .uri(orgID + "/hvs")
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .header("api-key", apiKey)
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<List<NetworksResponseObject>>() {})
            .block(REQUEST_TIMEOUT);

    for (NetworksResponseObject networksResponseObject : response) {
        results.addAll(networksResponseObject.getNetworks());
    }
} catch (Exception e) {
    return new LinkedList<>(); //出错时返回空列表
}

log.info("Found " + results.size() + " networks");
return results;
}
原因分析
  1. Content-Type头的特殊性:defaultHeaders中调用setContentType(MediaType.APPLICATION_JSON)是为请求体设置Content-Type,但你发起的是GET请求——GET请求默认无请求体,WebClient会自动忽略该Content-Type头,不会将其加入请求。
  2. api-key头未生效的可能原因:
    • apiKey变量在构建WebClient时未正确初始化,存在空值或未赋值情况,导致头信息未被正确设置;
    • 项目中存在ExchangeFilterFunction等WebClient自定义配置,覆盖或移除了默认头信息。
修复方案

针对两类请求头分别处理:

  1. 修正Content-Type头设置方式:
    如果后端要求GET请求必须携带Content-Type,不要使用setContentType,改用普通头添加方式:
    .defaultHeaders(header -> {
        header.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
        header.set("api-key", apiKey);
    })
    
    或者用defaultHeader方法单独设置:
    .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
    .defaultHeader("api-key", apiKey)
    
  2. 验证apiKey变量有效性:
    确保构建WebClient时apiKey已通过构造函数注入、配置文件读取等方式正确赋值,避免空值。
  3. 排查过滤器干扰:
    检查项目中为WebClient添加的ExchangeFilterFunction,确认其中没有修改、移除请求头的逻辑,防止默认头被覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:42:42