请求帮助实现基于OAuth2.0客户端凭证的Azure Log Analytics API Java客户端
Java实现Azure AD OAuth2客户端凭证模式访问Log Analytics API
我帮你整理了一套和Postman逻辑完全匹配的Java代码,分获取访问令牌和调用Log Analytics查询接口两个核心步骤,代码里会详细标注需要你替换的参数,同时也会说明依赖和注意事项:
一、所需依赖
如果你的项目是Maven,需要添加Jackson来解析JSON响应(用于解析令牌返回结果):
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> </dependencies>
如果使用Java 11及以上版本,自带的java.net.http.HttpClient就足够处理HTTP请求,不需要额外添加HTTP客户端依赖。
二、完整实现代码
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public class AzureLogAnalyticsClient { // 替换成你的Azure AD租户ID private static final String TENANT_ID = "YOUR_AAD_TENANT"; // 替换成你的应用注册客户端ID private static final String CLIENT_ID = "YOUR_CLIENT_ID"; // 替换成你的应用注册客户端密钥 private static final String CLIENT_SECRET = "YOUR_CLIENT_SECRET"; // Log Analytics的资源标识符(固定值) private static final String RESOURCE = "https://management.azure.com/"; // Log Analytics工作区ID,替换成你的实际ID private static final String WORKSPACE_ID = "8fXXXXX-0a84-XXX-XXX-c1a5XXXXXX"; public static void main(String[] args) throws Exception { // 第一步:获取访问令牌 String accessToken = getAccessToken(); System.out.println("获取到的访问令牌:" + accessToken); // 第二步:调用Log Analytics查询接口 String queryResult = callLogAnalyticsQuery(accessToken); System.out.println("查询结果:" + queryResult); } private static String getAccessToken() throws Exception { // 构建令牌请求的表单参数 Map<String, String> formParams = new HashMap<>(); formParams.put("grant_type", "client_credentials"); formParams.put("client_id", CLIENT_ID); formParams.put("client_secret", CLIENT_SECRET); formParams.put("resource", RESOURCE); // 将参数转换为x-www-form-urlencoded格式的字符串 String formData = formParams.entrySet().stream() .map(entry -> entry.getKey() + "=" + java.net.URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)) .collect(Collectors.joining("&")); // 构建HTTP请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://login.microsoftonline.com/" + TENANT_ID + "/oauth2/token")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(formData)) .build(); // 发送请求并获取响应 HttpClient client = HttpClient.newHttpClient(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); // 解析响应JSON,提取access_token ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(response.body()); return jsonNode.get("access_token").asText(); } private static String callLogAnalyticsQuery(String accessToken) throws Exception { // 构建查询请求体 String requestBody = "{\"query\": \"AzureActivity | limit 10\"}"; // 构建HTTP请求,携带Bearer令牌 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.loganalytics.io/v1/workspaces/" + WORKSPACE_ID + "/query?timespan=P1D")) .header("Authorization", "Bearer " + accessToken) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(requestBody)) .build(); // 发送请求并获取响应 HttpClient client = HttpClient.newHttpClient(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); return response.body(); } }
三、代码说明
- 获取令牌部分:
- 严格按照OAuth2客户端凭证模式的要求,发送
application/x-www-form-urlencoded格式的POST请求到Azure AD的令牌端点 - 解析返回的JSON响应,提取
access_token字段
- 严格按照OAuth2客户端凭证模式的要求,发送
- 调用Log Analytics接口部分:
- 在请求头中添加
Authorization: Bearer [access_token] - 请求体是JSON格式的查询语句,和你在Postman中使用的完全一致
- 在请求头中添加
- 参数替换:
- 请务必替换代码中所有大写的占位符(如
YOUR_AAD_TENANT、YOUR_CLIENT_ID等)为你自己的实际信息
- 请务必替换代码中所有大写的占位符(如
四、进阶优化建议
如果不想手动处理HTTP请求和令牌管理,可以使用Azure官方的azure-identity和azure-monitor-query SDK,代码会更简洁且更易维护:
import com.azure.identity.ClientSecretCredential; import com.azure.identity.ClientSecretCredentialBuilder; import com.azure.monitor.query.LogsQueryClient; import com.azure.monitor.query.LogsQueryClientBuilder; import com.azure.monitor.query.models.LogsQueryOptions; import com.azure.monitor.query.models.LogsQueryResult; import java.time.Duration; public class AzureLogAnalyticsSdkClient { public static void main(String[] args) { ClientSecretCredential credential = new ClientSecretCredentialBuilder() .tenantId("YOUR_AAD_TENANT") .clientId("YOUR_CLIENT_ID") .clientSecret("YOUR_CLIENT_SECRET") .build(); LogsQueryClient client = new LogsQueryClientBuilder() .credential(credential) .build(); LogsQueryResult result = client.queryWorkspace( "8fXXXXX-0a84-XXX-XXX-c1a5XXXXXX", "AzureActivity | limit 10", new LogsQueryOptions().setDuration(Duration.ofDays(1))); System.out.println(result.getTable().getRows()); } }
对应的Maven依赖:
<dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.10.0</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-query</artifactId> <version>1.2.0</version> </dependency> </dependencies>
内容的提问来源于stack exchange,提问作者Jeevika
相关产品推荐
相关产品推荐

