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
相关产品推荐
相关产品推荐

