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

如何使用RestTemplate获取认证Web服务响应体中的Token?

解决RestTemplate获取认证Token的问题

嘿,我来帮你搞定这个Token提取的事儿!你现在的代码把响应直接转成String,确实没法直接拿到Token,给你两种常用的解决方法,按需选就行:

方法一:用实体类自动映射(推荐,更规范)

首先根据接口返回的JSON结构,创建一个对应的Java实体类,把响应里的字段都对应上(比如你提到的响应里有id_token、access_token这些字段):

public class AuthResponse {
    private String id_token;
    private String access_token;
    private String token_type;
    private long expires_in;

    // 生成所有字段的getter和setter方法,用Lombok的话加个@Data注解就能省掉这些代码
    public String getId_token() {
        return id_token;
    }

    public void setId_token(String id_token) {
        this.id_token = id_token;
    }

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }

    // 其他字段的getter/setter也记得加上哦
}

然后修改你的RestTemplate调用代码,重点注意请求体格式和Content-Type匹配(你之前设置的是application/json,但用MultiValueMap是表单格式,这会导致请求不合法,得调整):

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Content-Type", "application/json");
requestHeaders.add("Accept", "application/json");
// 这里提个醒:如果是第一次获取Token,这个Authorization头大概率不需要吧?毕竟还没拿到Token呢,你根据实际接口要求调整
requestHeaders.add("Authorization", auth_token);

final String url = "http://192.168.1.3:18080/api/authenticate";
RestTemplate restTemplate = new RestTemplate();
// 其实RestTemplate默认已经带了MappingJackson2HttpMessageConverter,除非你要自定义配置,不然不用手动加
// restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
// restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

// 用Map构造JSON格式的请求体,和Content-Type对应上
Map<String, String> requestBody = new HashMap<>();
requestBody.put("password", password);
requestBody.put("username", username);

HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, requestHeaders);

// 直接请求并映射到AuthResponse对象
AuthResponse authResponse = restTemplate.postForObject(url, entity, AuthResponse.class);
// 拿到你需要的Token,比如id_token或者access_token
String targetToken = authResponse.getId_token();
return targetToken;

如果接口要求的是表单提交(Content-Type是application/x-www-form-urlencoded),那你再用MultiValueMap,同时把Content-Type改成对应的值就行。

方法二:用JSON工具直接解析字符串

要是不想写实体类,也可以用JSON解析工具直接处理返回的String:

用Jackson解析(RestTemplate默认依赖)

// 先拿到原有的String响应
String responseStr = restTemplate.postForObject(url, entity, String.class);

// 用ObjectMapper解析JSON
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(responseStr);
// 获取你需要的Token字段
String token = jsonNode.get("id_token").asText();
return token;

用FastJSON解析(需要先引入FastJSON依赖)

String responseStr = restTemplate.postForObject(url, entity, String.class);
JSONObject jsonObject = JSONObject.parseObject(responseStr);
String token = jsonObject.getString("id_token");
return token;

额外注意点

  • 一定要确认请求的Content-Type和接口要求一致,这是很容易踩坑的地方
  • 检查Authorization头是否必要,如果是首次认证,一般不需要这个头
  • 确保RestTemplate的消息转换器正常工作,这样JSON和Java对象的映射才不会出问题

内容的提问来源于stack exchange,提问作者AmYne Gaïeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:15