前言
最近在请求SharePoint API的时候碰到403错误,很明显没有权限,那么,为什么呢?SharePoint页面中应该有上下文才是。好吧,如果你也遇到这样的问题,就先看看请求一下contextinfo这个方法吧。
正文
1.Ajax 请求SharePoint Online API,如下:
jQuery.ajax({
url: "http://<site url>/_api/web/lists",
type: "POST",
data: JSON.stringify({ '__metadata': { 'type': 'SP.List' }, 'AllowContentTypes': true,
'BaseTemplate': 100, 'ContentTypesEnabled': true, 'Description': 'My list description', 'Title': 'Test' }
),
headers: {
"accept": "application/json;odata=verbose",
"content-type": "application/json;odata=verbose",
"content-length": <length of post body>,
"X-RequestDigest": $("#__REQUESTDIGEST").val()
},
success: doSuccess,
error: doError
});
2.但是,我们有时候没办法在页面中获取到"X-RequestDigest",那怎么办呢?这时候就需要contextinfo这个方法了:
参考:Navigate the SharePoint data structure represented in the REST service | Microsoft Docs
POST https://{site_url}/_api/contextinfo
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
3.当然,我们有时候还会在C#中请求,如下图:
HttpWebRequest endpointRequest =(HttpWebRequest)HttpWebRequest.Create("http://<site url>/_api/contextinfo");
endpointRequest.Method = "POST";
endpointRequest.Accept = "application/json;odata=verbose";
HttpWebResponse endpointResponse = (HttpWebResponse)endpointRequest.GetResponse();
4.这样的方式是调用API常用的方式:
$.ajax({
url: siteurl + '/_api/contextinfo',
method: 'POST',
headers: { 'Accept': 'application/json; odata=verbose' }
}).done(function (data) {
var requestDigest = data.d.GetContextWebInformation.FormDigestValue
......//your request
})
总结
除了调用api的时候需要contextinfo这个方法,很多时候在post的时候,也需要先这样获取RequestDigest,通常get方法可以不需要。