用java程序调用这个地址 GET https://graph.microsoft.com/v1.0/drives/{drive-id}/items/{item-id}/children?$filterlastModifiedDateTime gt 2023-10-01T00:00:00Z在 Java 中调用 Microsoft Graph API主要有两种方式1. **推荐使用Microsoft Graph SDK for Java**官方封装处理认证、分页、序列化更简单。2. **原生方式HttpClient MSAL4J**轻量级适合不想引入庞大 SDK 的场景。下面我为你提供这两种方式的完整代码示例。---### 前置准备 (两种方式都需要)在开始之前你需要在 **Azure Portal** 中注册一个应用并获取以下信息1. **Tenant ID** ({tenant-id})2. **Client ID** ({client-id})3. **Client Secret** ({client-secret})4. **API 权限**确保应用注册中添加了 Files.Read 或 Sites.Read.All 权限并授予了管理员同意。---### 方法一使用 Microsoft Graph SDK (推荐)这是最稳健的方式官方维护自动处理 Token 刷新和错误。#### 1. Maven 依赖 (pom.xml)你需要引入 Graph SDK 和 Azure Identity 库。xmldependencies!-- Microsoft Graph SDK --dependencygroupIdcom.microsoft.graph/groupIdartifactIdmicrosoft-graph/artifactIdversion6.10.0/version !-- 请使用最新稳定版 --/dependency!-- Azure Identity (用于认证) --dependencygroupIdcom.azure/groupIdartifactIdazure-identity/artifactIdversion1.11.0/version/dependency/dependencies#### 2. Java 代码示例javaimport com.azure.identity.ClientSecretCredential;import com.azure.identity.ClientSecretCredentialBuilder;import com.microsoft.graph.authentication.BaseBearerTokenAuthenticationProvider;import com.microsoft.graph.serviceclient.GraphServiceClient;import com.microsoft.graph.drives.item.items.item.children.ChildrenRequestBuilder;import com.microsoft.graph.models.DriveItem;import com.microsoft.graph.models.DriveItemCollectionResponse;import java.time.OffsetDateTime;import java.time.ZoneOffset;public class GraphApiExample {public static void main(String[] args) {// 1. 配置认证信息String tenantId {your-tenant-id};String clientId {your-client-id};String clientSecret {your-client-secret};// 2. 创建凭证 (ClientSecretCredential 适合后端服务)ClientSecretCredential credential new ClientSecretCredentialBuilder().tenantId(tenantId).clientId(clientId).clientSecret(clientSecret).build();// 3. 创建 Graph 客户端// 注意SDK v5 需要传入 AuthenticationProvidervar authProvider new BaseBearerTokenAuthenticationProvider(credential::getToken);GraphServiceClient graphClient new GraphServiceClient(authProvider);// 4. 配置参数String driveId {your-drive-id};String itemId {your-folder-item-id};// 设定查询时间 (ISO 8601 格式UTC)// 例如查询 2023-10-01 之后修改的文件String filterQuery lastModifiedDateTime gt 2023-10-01T00:00:00Z;try {// 5. 构建请求并应用 Filter// 对应 URL: /drives/{drive-id}/items/{item-id}/childrenDriveItemCollectionResponse response graphClient.drives().byDriveId(driveId).items().byDriveItemId(itemId).children().get(requestConfig - {requestConfig.queryParameters.filter filterQuery;// 可选限制返回数量// requestConfig.queryParameters.top 10;});// 6. 处理结果if (response.getValue() ! null) {for (DriveItem item : response.getValue()) {System.out.println(文件名称 item.getName());System.out.println(最后修改时间 item.getLastModifiedDateTime());System.out.println(Web URL: item.getWebUrl());System.out.println(-------------------);}} else {System.out.println(没有找到符合条件的文件。);}} catch (Exception e) {e.printStackTrace();}}}---### 方法二使用原生 HttpClient MSAL4J (轻量级)如果你不想引入庞大的 Graph SDK可以使用 Java 11 自带的 HttpClient 配合 msal4j 获取 Token。#### 1. Maven 依赖xmldependencies!-- MSAL4J 用于获取 Token --dependencygroupIdcom.microsoft.azure/groupIdartifactIdmsal4j/artifactIdversion1.14.0/version/dependency!-- JSON 解析 (可选这里用简单的 String 处理演示) --dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.2/version/dependency/dependencies#### 2. Java 代码示例javaimport com.microsoft.aad.msal4j.ClientCredentialFactory;import com.microsoft.aad.msal4j.ClientCredentialParameters;import com.microsoft.aad.msal4j.ConfidentialClientApplication;import com.microsoft.aad.msal4j.IAuthenticationResult;import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.util.Collections;import java.util.Set;public class RawHttpClientExample {public static void main(String[] args) throws Exception {String tenantId {your-tenant-id};String clientId {your-client-id};String clientSecret {your-client-secret};String driveId {your-drive-id};String itemId {your-folder-item-id};// 1. 使用 MSAL4J 获取 Access TokenString authority https://login.microsoftonline.com/ tenantId;SetString scope Collections.singleton(https://graph.microsoft.com/.default);ConfidentialClientApplication app ConfidentialClientApplication.builder(clientId, ClientCredentialFactory.createFromSecret(clientSecret)).authority(authority).build();ClientCredentialParameters parameters ClientCredentialParameters.builder(scope).build();IAuthenticationResult result app.acquireToken(parameters).join();String accessToken result.accessToken();// 2. 构建 Graph API URL// 注意URL 中的 filter 参数最好进行 URLEncode虽然 HttpClient 通常能处理但为了安全建议编码String filterValue lastModifiedDateTime gt 2023-10-01T00:00:00Z;String url String.format(https://graph.microsoft.com/v1.0/drives/%s/items/%s/children?$filter%s,driveId, itemId, java.net.URLEncoder.encode(filterValue, UTF-8));// 3. 发送 HTTP GET 请求HttpClient client HttpClient.newHttpClient();HttpRequest request HttpRequest.newBuilder().uri(URI.create(url)).header(Authorization, Bearer accessToken).header(Content-Type, application/json).GET().build();HttpResponseString response client.send(request, HttpResponse.BodyHandlers.ofString());// 4. 输出结果if (response.statusCode() 200) {System.out.println(请求成功);System.out.println(response.body()); // 这里是 JSON 字符串可用 Jackson 解析} else {System.out.println(请求失败 response.statusCode());System.out.println(response.body());}}}---### 关键注意事项1. **Drive ID 和 Item ID 哪里来*** **Drive ID**: 通常是 SharePoint 站点关联的 Drive ID。你可以通过 GET /sites/{site-id}/drive 获取。* **Item ID**: 是文件夹在 Drive 中的 ID。你可以通过浏览 SharePoint 网页或者调用 API 获取根目录列表来找到特定文件夹的 ID。* *提示*如果不确定 ID可以先调用 /children 不带 filter 参数打印出返回的 id 和 name 来确认。2. **时间格式 (Time Format)*** Graph API 严格要求 **ISO 8601** 格式。* 必须包含 T 和 Z (表示 UTC)。* 错误示例2023-10-01 00:00:00 (空格无时区)* 正确示例2023-10-01T00:00:00Z3. **权限问题 (403 Forbidden)*** 如果返回 403请检查 Azure AD 应用注册中的 **API Permissions**。* 确保添加了 Files.Read.All 或 Sites.Read.All。* 确保点击了 **Grant Admin Consent (授予管理员同意)**。4. **URL 编码*** 在方法二原生 HttpClient中$filter 的值包含空格和特殊字符必须使用 URLEncoder.encode 进行编码否则服务器可能无法解析。SDK (方法一) 会自动处理这一点。建议优先使用 **方法一 (SDK)**因为它能帮你处理很多底层的细节如分页 odata.nextLink、Token 自动刷新等。