在简单的网页中使用SharePoint 2013跨域库:有可能吗?

时间:2014-06-12 10:36:19

标签: javascript sharepoint cross-domain

我在服务器上托管了一个网页,比如http://SVR1/path/index.html,我希望访问托管在另一台服务器上的本地SharePoint网站上的某些列表项,例如http://SVR2/sites/mySite/

我正在使用的SharePoint的当前安装(不在我的控制之下)不允许部署SharePoint托管的应用程序和托管服务器托管的应用程序,因此我尝试使用SharePoint跨域库来访问所需的列表项来自纯粹的外部HTML5 / JS / CSS3页面。作为用户,我对SharePoint网站中的列表具有完全访问权限,因此我认为阅读其项目应该没有问题。

根据找到here的示例,我的页面如下:

<!doctype html>
<html>
<head>
  <!-- Title -->
  <title>Application Template</title>
  <script language="javascript" type="text/javascript" src="js/jquery.js"></script>
  <script language="javascript" type="text/javascript">

    var hostweburl = "http://SVR2/sites/mySite";
    var appweburl  = "http://SVR1/path";

    // Load the required SharePoint libraries
    $(document).ready(function () {

      $("#renderList").html("Requesting Lists...");

      // resources are in URLs in the form:
      // web_url/_layouts/15/resource
      var scriptbase = hostweburl + "/_layouts/15";

      // Load the js files and continue to the successHandler
      $.getScript(scriptbase + "/SP.RequestExecutor.js", execCrossDomainRequest);
    });

    ///////////////////////////////////////////////////////
    // Function to prepare and issue the request to get
    //  SharePoint data
    function execCrossDomainRequest() {
      // executor: The RequestExecutor object
      // Initialize the RequestExecutor with the app web URL.
      var executor = new SP.RequestExecutor(appweburl);

      // Issue the call against the host web.
      // To get the title using REST we can hit the endpoint:
      //      hostweburl/_api/web/lists/getbytitle('listname')/items
      // The response formats the data in the JSON format.
      // The functions successHandler and errorHandler attend the
      //      sucess and error events respectively.
      executor.executeAsync(
          {
            url: hostweburl + "/_api/web/lists",
            method: "GET",
            headers: { "Accept": "application/json; odata=verbose" },
            success: successHandler,
            error: errorHandler
          }
      );
    }

    ///////////////////////////////////////////////////////
    // Function to handle the success event.
    // Prints the data to the page.
    function successHandler(data) {
      var jsonObject = JSON.parse(data.body);
      var listsHTML = "";

      var results = jsonObject.d.results;
      for (var i = 0; i < results.length; i++) {
        listsHTML = listsHTML +
            "<p><h1>" + results[i].Title +
            "</h1>" + results[i].Body +
            "</p><hr>";
      }

      document.getElementById("renderList").innerHTML =
          listsHTML;
    }

    ///////////////////////////////////////////////////////
    // Function to handle the error event.
    // Prints the error message to the page.
    function errorHandler(data, errorCode, errorMessage) {
      document.getElementById("renderList").innerText =
          "Could not complete cross-domain call: " + errorMessage;
    }
  </script>

</head>

<body>
  <h1 id="Root Page" style="text-align:center;">This is the home page</h1>
  <div id="renderList">Placeholder</div>
</body>
</html>

当我在浏览器中加载页面时,在javascript控制台中出现错误:&#34;未捕获错误:无效字段或参数requestInfo.url。&#34;。

我的印象是问题出在变量appweburl的内容中,在我发现的所有示例中,SharePoint都是由URL提供的,作为URL中查询部分的一部分。但这意味着已经在SharePoint中部署了提供商托管的应用程序 - 这是我无法做到的 - 而且这个应用程序正在调用其远程托管的对应应用程序。

所以问题是:是否可以在完全位于SharePoint外部的页面中使用SharePoint跨域库,如果是,我应该如何设置hostweburlappweburl以及其他可能的内容有权访问SharePoint列表吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您提到的两个网址appwebUrl和hostwebUrl确实设计用于应用,因此我认为您不应该使用跨域库。

如果您只是使用非app方式连接怎么办?例如,您可以调用自定义Web服务(在sharepoint之外),它可以通过CSOM连接到您的SP站点,或者您可以直接在javascript中执行此操作。