Java中如何从API响应体提取access_token并保存为字符串?
解决方案:从Spotify API的JSON响应中提取access_token
首先明确两个关键点:
java.net包仅负责HTTP请求的发送与响应接收,没有内置JSON解析能力,无法直接从响应体中提取指定字段;- 你最初的判断是对的——Spotify的
access_token不在响应头里,而是存储在响应体的JSON数据中,必须解析完整响应体才能获取。
下面提供几种常用的实现方式:
方式一:使用Jackson Databind(推荐,生态完善)
Jackson是Java生态中最常用的JSON处理库,支持将JSON映射为Java对象或直接读取指定字段。
步骤1:添加依赖
如果使用Maven,在pom.xml中加入:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
步骤2:修改代码提取access_token
可以直接用ObjectMapper将JSON字符串解析为Map,快速提取目标字段:
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; public class App { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://accounts.spotify.com/api/token")) .header("Content-Type", "application/x-www-form-urlencoded") .method("POST", HttpRequest.BodyPublishers.ofString("grant_type=client_credentials&client_id=[MY_ID]&client_secret=[MY_SECRET]")) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); // 解析JSON并提取access_token ObjectMapper objectMapper = new ObjectMapper(); Map<String, Object> responseMap = objectMapper.readValue(response.body(), Map.class); String accessToken = (String) responseMap.get("access_token"); System.out.println("提取到的access_token:" + accessToken); // 后续可直接使用accessToken变量调用需要认证的API } }
方式二:使用org.json(轻量,无需定义实体类)
如果只需要简单读取单个字段,org.json库足够轻便,无需提前定义POJO类。
步骤1:添加依赖
Maven依赖:
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20230618</version> </dependency>
步骤2:修改代码
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import org.json.JSONObject; public class App { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://accounts.spotify.com/api/token")) .header("Content-Type", "application/x-www-form-urlencoded") .method("POST", HttpRequest.BodyPublishers.ofString("grant_type=client_credentials&client_id=[MY_ID]&client_secret=[MY_SECRET]")) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); // 解析JSON并提取access_token JSONObject jsonResponse = new JSONObject(response.body()); String accessToken = jsonResponse.getString("access_token"); System.out.println("提取到的access_token:" + accessToken); } }
不推荐:正则表达式提取
如果不想引入第三方库,可以用正则匹配临时提取,但这种方式容易因为JSON格式变化(比如字段顺序、空格)出错,仅适合快速测试:
// 在获取response.body()后添加 String responseBody = response.body(); String accessToken = responseBody.replaceAll(".*\"access_token\":\"(.*?)\".*", "$1"); System.out.println(accessToken);
内容的提问来源于stack exchange,提问作者ant
相关产品推荐
相关产品推荐

