You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过HttpClient从SharePoint REST API获取JSON格式数据?

解决HttpClient调用SharePoint REST API返回XML而非JSON的问题

我来帮你搞定这个问题!你遇到的核心问题是没有正确设置请求头来告知SharePoint服务器你需要JSON格式的响应,咱们一步步梳理并修正代码:

原代码的问题分析

  • 你把关键的Accept请求头设置给注释掉了,这是告诉服务器返回什么格式的核心配置
  • 手动修改response.Content.Headers.ContentType完全没用——响应已经从服务器发回来了,改本地的头信息不会改变实际返回的内容
  • GET请求不需要设置Content(请求体),你添加的空StringContent属于多余操作
  • Authorization头的写法有小问题:AuthenticationHeaderValue的第一个参数是认证方案(比如"NTLM"),第二个参数是凭证(NTLM认证通常推荐用默认凭据处理,而非手动设置)

修正后的代码

using (var handler = new HttpClientHandler
{
    // 使用当前登录用户的凭据处理NTLM认证,比手动设置Authorization更可靠
    UseDefaultCredentials = true,
    AllowAutoRedirect = true
})
using (var client = new HttpClient(handler))
{
    // 关键:添加Accept头,明确要求SharePoint返回JSON格式
    client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json;odata=verbose")
    );

    var request = new HttpRequestMessage(
        HttpMethod.Get, 
        "http://sp2016/_api/lists/getbytitle('Holidays')/items"
    );

    var response = await client.SendAsync(request);
    response.EnsureSuccessStatusCode(); // 确保请求成功,否则抛出异常

    var content = await response.Content.ReadAsStringAsync();
    var data = JsonConvert.DeserializeObject<Holidays>(content);
    
    // 这里可以继续处理反序列化后的data对象
}

关键要点解释

  1. Accept请求头是核心
    SharePoint REST API默认返回XML格式,必须通过Accept: application/json;odata=verbose(或其他OData格式参数,比如odata=nometadata简化响应)明确告知服务器你需要JSON响应。

  2. NTLM认证的正确姿势
    手动设置Authorization头处理NTLM容易出问题,使用HttpClientHandler.UseDefaultCredentials = true会自动使用当前用户的凭据完成NTLM认证,更稳定可靠。

  3. GET请求无需请求体
    GET请求没有请求体,所以不需要设置msg.Content,多余的设置不会影响结果,但会增加不必要的代码复杂度。

  4. 不要修改响应的Content-Type
    拿到响应后修改response.Content.Headers.ContentType只是改变了本地对象的属性,不会把已经返回的XML转换成JSON,完全无效。

内容的提问来源于stack exchange,提问作者Burre Ifort

火山引擎 最新活动