如何在完全信任的解决方案中通过javascript调用Sharepoint 2013 API

How to call Sharepoint 2013 API by javascript in full trust solutions?

本文关键字:javascript 调用 Sharepoint API 2013 解决方案 信任      更新时间:2023-09-26

我正在开发一个农场解决方案(完全信任)与一些自定义的webpart。对于一个WebPart,我想要一些ajax行为,所以我想:为什么不使用JSOM API?我的web部件只是想检索新的公告,所以我添加了一个新的WebPart(农场解决方案),一些HTML和以下javascript

<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript">
function retrieveListItems() {
  SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
    var ctx = SP.ClientContext.get_current();
    var web = ctx.get_web();
    var list = web.get_lists().getByTitle("Announcements");
    ctx.load(list);
    ctx.executeQueryAsync(
          function () {
              console.log(list.get_title());
          },
          function (sender, args) {
              console.log(args.get_message());
          }
        );
  });
}

在我的HTML我有一个链接调用js函数:

<a onclick="retrieveListItems(); return false;">Call</a>

当我调用函数时,我收到一个403 FORBIDDEN错误,谷歌chrome控制台显示我以下

/_vti_bin/client.svc/ProcessQuery 403 (FORBIDDEN)
     executeRequest         @ MicrosoftAjax.js:5
     executeRequest         @ MicrosoftAjax.js:5
     invoke                 @ MicrosoftAjax.js:5
     $31_0                  @ sp.runtime.js:2
     executeClientRequestAsync  @ sp.runtime.js:2
     executeQueryAsync      @ sp.runtime.js:2
     retrieveListItems      @ default.aspx:1091
     onclick                @ default.aspx:1118

在Google Chrome控制台的NETWORK选项卡中,在PREVIEW(响应)中,我看到以下

[{SchemaVersion: "15.0.0.0", LibraryVersion: "15.0.4420.1017", ErrorInfo: {,…},…}]
  0:{SchemaVersion: "15.0.0.0", LibraryVersion: "15.0.4420.1017", ErrorInfo: {,…},…}
  ErrorInfo:{,…}
  ErrorCode:-2130575251
  ErrorMessage:"A validação de segurança para esta página não é válida e pode estar corrompida. Use o botão Voltar do navegador da Web para tentar realizar a operação novamente."
  TRANSLATING: The security validation for this page is invalid and might be corrupted.  Please use your web browser's Back button to try your operation again.
  ErrorTypeName:"Microsoft.SharePoint.SPException"
  ErrorValue:null
  TraceCorrelationId:"78edb09d-fb1d-7012-0000-026d47d0154a"
  LibraryVersion:"15.0.4420.1017"
  SchemaVersion:"15.0.0.0"
  TraceCorrelationId:"78edb09d-fb1d-7012-0000-026d47d0154a"

我做了一些研究,我发现了一些与FormDigest相关的东西,所以我搜索了我的HTML标记的__REQUESTDIGEST并复制了它的值,调用函数并意识到发送的摘要是不同的。这可能是问题的根源?

我做了更多的研究,发现这个js函数欺骗了RequestDigest:
 function CustomUpdateFormDigest() {
    if (window._spPageContextInfo != null) {
        var $v_2 = window._spPageContextInfo;
        var $v_3 = $v_2.webServerRelativeUrl;
        var $v_4 = window._spFormDigestRefreshInterval;
        UpdateFormDigest($v_3, $v_4);
    }
}

在调用我的retrieveListItems()函数之前调用它,但它不起作用。有人能告诉我正确的方向吗?这真的是一个消化问题吗?

编辑:我意识到,如果我的页面有我的网页部分,我得到错误,当我点击链接,如果我在谷歌chrome控制台执行脚本。如果我从页面中删除我的webpart,我可以在Google Chrome控制台成功执行脚本。

如果要查询同一站点,则不应该实例化新的上下文,而应该使用SP.ClientContext.get_current()。
如果你正在查询另一个网站,那么你将不得不处理一些身份验证和/或使用执行代理,这取决于你在做什么。请记住,这通常是一个糟糕的做法,查询到不同的网站。你应该用搜索代替。
另外,你不应该引用SharePoint js文件,而应该使用Script On demand (SOD)结构来等待SharePoint准备好后再调用你的库。

找到解决方案了!

我以错误的方式引用了我的脚本我是这样引用的:

<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript" src="/_layouts/15/sp.runtime.js"> </script>
<script type="text/javascript" src="/_layouts/15/sp.js"> </script>
<script type="text/javascript" src="/_layouts/SP.debug.js"></script>

正确的方法是:

<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript" src="/Style Library/Js/TopNavigation.js"> </script>

并加载SP脚本时,我将使用它,像这样:

SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
   // My code...
});