如何通过HttpClient从SharePoint REST API获取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对象 }
关键要点解释
Accept请求头是核心:
SharePoint REST API默认返回XML格式,必须通过Accept: application/json;odata=verbose(或其他OData格式参数,比如odata=nometadata简化响应)明确告知服务器你需要JSON响应。NTLM认证的正确姿势:
手动设置Authorization头处理NTLM容易出问题,使用HttpClientHandler.UseDefaultCredentials = true会自动使用当前用户的凭据完成NTLM认证,更稳定可靠。GET请求无需请求体:
GET请求没有请求体,所以不需要设置msg.Content,多余的设置不会影响结果,但会增加不必要的代码复杂度。不要修改响应的Content-Type:
拿到响应后修改response.Content.Headers.ContentType只是改变了本地对象的属性,不会把已经返回的XML转换成JSON,完全无效。
内容的提问来源于stack exchange,提问作者Burre Ifort




