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

请求帮助实现基于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();
    }
}

三、代码说明

  1. 获取令牌部分:
    • 严格按照OAuth2客户端凭证模式的要求,发送application/x-www-form-urlencoded格式的POST请求到Azure AD的令牌端点
    • 解析返回的JSON响应,提取access_token字段
  2. 调用Log Analytics接口部分:
    • 在请求头中添加Authorization: Bearer [access_token]
    • 请求体是JSON格式的查询语句,和你在Postman中使用的完全一致
  3. 参数替换:
    • 请务必替换代码中所有大写的占位符(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:59:18