基于 Microsoft Sharepoint 此处文档 我正在尝试使用 REST API 列出我的 Sharepoint 应用程序文档库和文件夹。
我尝试使用 Java 使用 apache HTTP 客户端并使用 Postman,这两种方式都失败,状态代码 400 和错误消息:值未落在预期范围内。
以下是响应错误消息:
<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code>-2147024809, System.ArgumentException</m:code>
<m:message xml:lang="en-US">Value does not fall within the expected range.</m:message>
</m:error>
这是邮递员的截图:
我正在使用 NTLM 身份验证
这是我的java代码示例(测试用例):
@Test
public void testListFolders() {
// SharePoint site URL and API endpoint
String siteUrl = "http://sharepoint2013.MY_SITE_NAME.com/sites/home";
String apiEndpoint = "/_api/web/GetFolderByServerRelativeUrl('/Shared%20Documents')/Folders";
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(AuthScope.ANY),
new NTCredentials(String.join(":", "MY_USERNAME", "MY_PASSWORD")));
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setExpectContinueEnabled(false)
.setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
.setProxyPreferredAuthSchemes(Collections.singletonList(AuthSchemes.BASIC))
.build();
// Create HttpClient instance
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultRequestConfig(defaultRequestConfig)
.build();
// Create HTTP GET request
HttpGet request = new HttpGet(siteUrl + apiEndpoint);
request.setHeader(HttpHeaders.ACCEPT, "application/json;odata=verbose");
try {
// Execute the request
HttpResponse response = httpClient.execute(request);
System.out.println("Status code: " + response.getStatusLine().getStatusCode());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
状态代码始终为 400,并且错误消息与 Postman 形式相同。
如果我将此测试用例的端点替换为列出 Sharepoint 列表的端点:
/_api/web/Lists/?$Select=Title%2CIsApplicationList%2CContentTypesEnabled%2CHidden%2CBaseType%2CItemCount%2CIsCatalog&$Filter=BaseType%20eq%200%20and%20Hidden%20eq%20false
它将正常工作并返回有效的响应和状态代码 200
为此您可能需要单独的 API 调用。您可以使用
'_api/web/lists'
端点获取列表/文档库。然后,对于每个列表,您可以点击 'list/getbytitle('listname')/items'
端点来获取列表的项目。 这里的问题是,您可以使用过滤器参数来仅获取文件夹,即 '$filter= 'FileSystemObjectType = 1'。这应该只返回响应中的文件夹。
您可以使用以下api来获取列表下的项目
/sites/xxx.sharepoint.com,{siteid}/lists/{listid}/drive/root/children