从sharepoint app访问sharepoint列表时的跨域问题

时间:2015-04-21 08:32:05

标签: sharepoint sharepoint-2013 sharepoint-list

这是我的代码

function getListItem(url, listname, id, complete, failure) {
    // Getting our list items
    $.ajax({
        url: url + "/_api/lists/getbytitle('"+ listname +"')/items",
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
            // Returning the results
            complete(data);
        },
        error: function (data) {
            failure(data);
        }
    });
};

url正确显示,同样在url调用中检查完整的ajax参数时,当我在新标签中打开时,它会返回数据

但是,由于此ajax调用是在位于其他域中的sharepoint应用内进行的,因此会抛出错误 - No 'Access-Control-Allow-Origin' header is present on the requested resource

我应该在我的网站上进行哪些更改,以使该列表可用于跨域调用。

的信息: 网站网址为http://www.vignesh.cloudappsportal.com/ 应用网址为xxxx.apps.cloudappsportal.net/CloudAppsTrial/Pages/Default.aspx

1 个答案:

答案 0 :(得分:1)

出于安全考虑,现代网络浏览器会阻止跨域调用。这是基于Web的开发中的常见问题,并且由于SharePoint托管应用程序的性质而特别相关。例如,当从App(托管在http://consoto.sharepoint.com)访问父Web(http://apps.sharePoint.com/SPApp)中的数据时,将阻止呼叫。为了解决这个问题,您可以使用SP.RequestExecutor.js脚本将消息从同一域中继到SharePoint。

示例

function getListItems(hostUrl,appWebUrl, listTitle,success,error) 
{
    var url = appWebUrl + "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + listTitle + "')/items?@target='" + hostUrl + "'";
    var executor = new SP.RequestExecutor(appWebUrl);
    executor.executeAsync(
        {
           url: url,
           method: "GET",
           headers: { "Accept": "application/json; odata=verbose" },
           success: function (data) {
                var data = JSON.parse(data.body);
                success(data.d.results);
           },
           error: error
       });
}

用法

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

var appWebUrl = getParameterByName('SPAppWebUrl');
var hostUrl = getParameterByName('SPHostUrl');
var scriptbase = hostUrl + '/_layouts/15/';
$.getScript(scriptbase + "SP.RequestExecutor.js", function (data) {
   getListItems(hostUrl,appWebUrl, 'Tasks',function(data){
       //print list items properties
       data.forEach(function(item){
          console.log(item.Title);             
       });

   },
   function(error){
       //error handling goes here...   
   });
});

关于应用权限

SharePoint应用使用权限请求来指定正常运行所需的权限。权限请求指定应用程序所需的权限以及它需要权限的范围。这些权限是应用程序清单的一部分。下图演示了如何为App授予读取权限 enter image description here

关注App permissions in SharePoint 2013了解更多详情。