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; }
原因分析
- Content-Type头的特殊性:
defaultHeaders中调用setContentType(MediaType.APPLICATION_JSON)是为请求体设置Content-Type,但你发起的是GET请求——GET请求默认无请求体,WebClient会自动忽略该Content-Type头,不会将其加入请求。 - api-key头未生效的可能原因:
apiKey变量在构建WebClient时未正确初始化,存在空值或未赋值情况,导致头信息未被正确设置;- 项目中存在
ExchangeFilterFunction等WebClient自定义配置,覆盖或移除了默认头信息。
修复方案
针对两类请求头分别处理:
- 修正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) - 验证apiKey变量有效性:
确保构建WebClient时apiKey已通过构造函数注入、配置文件读取等方式正确赋值,避免空值。 - 排查过滤器干扰:
检查项目中为WebClient添加的ExchangeFilterFunction,确认其中没有修改、移除请求头的逻辑,防止默认头被覆盖。
内容的提问来源于stack exchange,提问作者yansto
相关产品推荐
相关产品推荐

