如何使用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
相关产品推荐
相关产品推荐

