使用SharePoint REST API无法列出文件夹的问题排查
我参考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
相关产品推荐
相关产品推荐

