前言
最近在请求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方法可以不需要。