Spring环境下如何通过带认证Token的API获取并解析JSON
问题解答
1. Jackson的ObjectMapper.readValue()无法直接添加请求头
readValue()只是JSON解析工具,它的作用是把输入的字节流、字符串转换成Java对象,根本不负责HTTP请求的发送。你之前能调用无Token的API,应该是通过URL.openStream()这类简单方式先拿到了API的响应流,再传给readValue()——但这种方式没法自定义请求头,所以才会返回403权限错误。
2. 解析JSON与请求认证是独立环节,Jackson/Spring注解只负责解析
不管API是否需要Token认证,只要你能拿到合法的JSON响应,用Jackson的@JsonProperty、Spring的@JsonAlias这类注解解析的方式完全一致。认证是HTTP请求阶段要处理的事,解析是拿到响应后的操作,两者互不影响。
3. 没必要用原生Java HttpRequest,Spring生态有更简便的实现方式
方案一:Spring RestTemplate(适合传统Spring项目)
直接在请求头中携带Token,发送请求后可直接让RestTemplate帮你解析成目标对象:
// 初始化RestTemplate实例 RestTemplate restTemplate = new RestTemplate(); // 构造请求头,添加Token(注意格式,多数API要求Bearer前缀) HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer " + "你的个人Token"); HttpEntity<Void> requestEntity = new HttpEntity<>(headers); // 发送GET请求并自动解析为目标类对象 YourTargetClass apiResult = restTemplate.exchange( "https://目标API的完整地址", HttpMethod.GET, requestEntity, YourTargetClass.class ).getBody();
方案二:Spring WebClient(适合Spring Boot 2.x及以上,支持响应式场景)
// 初始化WebClient,全局默认添加Token请求头 WebClient webClient = WebClient.builder() .baseUrl("https://目标API的域名") .defaultHeader("Authorization", "Bearer " + "你的个人Token") .build(); // 发送请求并解析结果(非响应式场景用block()获取同步结果) YourTargetClass apiResult = webClient.get() .uri("/具体的接口路径") .retrieve() .bodyToMono(YourTargetClass.class) .block();
若坚持使用原生Java(不推荐)
也可以通过HttpRequest添加请求头,拿到响应流后再用Jackson解析:
// 构造带Token的HTTP请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://目标API的完整地址")) .header("Authorization", "Bearer " + "你的个人Token") .build(); // 发送请求并获取响应流 HttpResponse<InputStream> response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofInputStream() ); // 用Jackson解析响应流为目标对象 ObjectMapper mapper = new ObjectMapper(); YourTargetClass apiResult = mapper.readValue(response.body(), YourTargetClass.class);
内容的提问来源于stack exchange,提问作者JuniorD
相关产品推荐
相关产品推荐

