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

RestTemplate添加请求头调用exchange方法返回401未授权如何解决

问题根因

你的代码返回401的核心原因是**Authorization鉴权字段放错了位置**:

  • 你创建的headersAuth才是请求头的容器,但你只给它设置了Accept字段,根本没有把鉴权token放进去
  • 你存入queryParamsAuth的内容,会被RestTemplate当做URL路径占位符替换值、或者URL查询参数处理,不会被添加到请求头里。相当于你把token拼到了URL上,服务端从请求头读不到鉴权凭证,自然返回401未授权。

另外注意绝大多数接口的Authorization头值需要携带鉴权类型前缀,比如常用的JWT鉴权需要写成Bearer 你的token值,如果不加前缀也会被判定为无效凭证,这个要根据你对接的接口实际要求调整。

修正后实现代码
HttpHeaders headersAuth = new HttpHeaders();
headersAuth.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
// 正确将鉴权token设置到请求头中,Bearer前缀根据实际接口要求调整
headersAuth.set(HttpHeaders.AUTHORIZATION, "Bearer " + tokenValue);
HttpEntity<?> entityAuth = new HttpEntity<>(headersAuth);

String urlTemplateAuth = UriComponentsBuilder.fromHttpUrl("some url")
        .encode()
        .toUriString();

// 无URL模板占位符时不需要额外传参数Map
ResponseEntity<UserGetPhoneDto> userGetPhoneDtoResponseEntity = restTemplate.exchange(
        urlTemplateAuth,
        HttpMethod.GET,
        entityAuth,
        UserGetPhoneDto.class
);
额外说明

如果你的接口确实需要传递查询参数,不要和请求头逻辑混淆:

  • 可以直接在UriComponentsBuilder链式调用中用.queryParam("参数名", 参数值)拼接
  • 也可以在URL字符串中写{占位符名},再通过最后一个Map参数传入对应的值做替换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:39:25