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

使用SharePoint REST API无法列出文件夹的问题排查

关于SharePoint REST API调用文件夹接口返回400错误的问题

我参考Microsoft SharePoint文档,尝试通过REST API列出SharePoint站点的文档库及文件夹。不管用Java的Apache HttpClient还是Postman调用,都返回400状态码,错误信息是Value does not fall within the expected range,认证方式采用NTLM。但调用另一个SharePoint列表接口(/_api/web/Lists/?$Select=Title%2CIsApplicationList%2CContentTypesEnabled%2CHidden%2CBaseType%2CItemCount%2CIsCatalog&$Filter=BaseType%20eq%200%20and%20Hidden%20eq%20false)能正常返回200状态码及有效响应。

错误响应内容

<?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>

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();
        }
    }
}

疑问

  • 调用SharePoint REST API列出文件夹是否缺少特定请求头?
  • 是否需要在SharePoint应用中设置/启用某些权限或配置?
  • 我的代码或请求是否存在错误?

问题排查与解决方案

1. 请求头检查

当前设置的Accept头符合要求,但可以尝试添加Content-Type: application/json;odata=verbose请求头。虽然GET请求通常不需要此头,但部分SharePoint环境可能要求它来正确解析请求格式,避免因格式识别问题返回错误。

2. SharePoint权限与配置

  • 先确认当前用户对Shared Documents文档库拥有读取权限:权限不足一般返回403,但特殊环境下可能触发异常码,需确保权限配置正确。
  • 核心检查点:文档库的服务器相对路径是否正确。你的站点路径是/sites/home,那么文档库的完整服务器相对路径应为/sites/home/Shared Documents,而非仅/Shared%20Documents,这是导致400错误的常见原因。

3. 代码与请求错误

  • API端点路径错误:GetFolderByServerRelativeUrl的参数必须是文档库相对于Web应用的完整路径。修正后的API端点应为:
    /_api/web/GetFolderByServerRelativeUrl('/sites/home/Shared%20Documents')/Folders
    
  • NTLM认证参数不完整:NTCredentials的构造参数顺序为username, password, workstation, domain,你当前仅传入了用户名和密码,可能缺少域信息。修正代码如下:
    new NTCredentials("MY_USERNAME", "MY_PASSWORD", "", "MY_DOMAIN")
    

建议先在Postman中修正路径后测试,确认能正常返回数据,再同步修改Java代码对应部分。

内容的提问来源于stack exchange,提问作者Selim Alawwa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:27:27