【问题标题】:How to make jQuery AJAX function continue after 401 error401错误后如何使jQuery AJAX功能继续
【发布时间】:2018-12-03 21:46:06
【问题描述】:

我正在尝试通过 REST API 遍历 SharePoint 组 ID 的数据集,并处理结果。问题是,我无法访问所有组(这是意料之中的)。在这种情况下,我想将组 ID 记录为“拒绝访问”并继续下一个。

当代码到达我无权访问的第一个组时,系统会提示我输入凭据,正如预期的那样。无论我输入 cred 还是直接单击“取消”,我都会收到预期的 401 错误,并且脚本会退出 -

HTTP401: DENIED - The requested resource requires user authentication.
(XHR)GET - https://{sourceSharePointSite}/_api/Web/SiteGroups/GetById({groupID})/Users

所以,是的,我得到了我无权访问的第一个组的 ID,但是脚本刚刚退出,我真的需要检查其余的组(超过 400 个。不要问)

这是我的代码...

function getMultiGroupMembers(arrGroups){// arrGroups is an object defined earlier
  $(arrGroups).each(function(i){
    var myId = arrGroups.results[i].Id;
    var myTitle = arrGroups.results[i].Title;
    log("Group ID: "+myId+" Group Name: "+myTitle+ " Members:"); 
    getData(myId).then(function() {
      log( "getMultiGroupMembers success" );
    }, function() {
      log( "getMultiGroupMembers fail" );
    })  
  });  
}

function getData(groupId) {
  var url = myUrl + "/_api/Web/SiteGroups/GetById("+groupId+")/Users";
  return $.getJSON(url).then(function(data){
    log("getGroupMembers() success: " + data);
    arrUsers = jsonToCsv(data.d); // convert the JSON object to CSV for exporting
    log(JSON.stringify(arrUsers)); // display the results in the log
  }, function(err) {
    var dfd = $.Deferred();
    dfd.reject(err)
    return dfd.promise();
  })
}

真的不确定我错过了什么。我在 MS Edge 和 Chrome 中尝试过

【问题讨论】:

  • 不确定,但我认为 jQuery 会在第一次 fail() 调用时停止所有 ajax 调用。 See this answer for more info。多人写了$.whenAll() 来解决这个问题。

标签: jquery ajax rest sharepoint


【解决方案1】:

更新:

使用此端点:_api/web/currentuser/groups。它将显示用户有权访问的所有组。使用 /_api/Web/SiteGroups 获取所有组。依次筛选,您会得到想要的结果。

旧:

也许你可以改变逻辑?

1。 获取您有权访问的所有组。 只需调用“/_api/Web/SiteGroups”,无需任何附加参数。 SharePoint REST API 必须返回您仅对您的组可用。 从您的预定义列表中排除所有获得的组。 预定义列表中的所有剩余组都是您想要找到的,即“拒绝访问”。

我了解此逻辑不考虑不存在的组。但可能是您当前的逻辑还没有考虑不存在的组。如果您无权访问组,那么您将无法了解它是否存在。

2。 此外,如果您使用 SharePoint On-premise 那么您可以创建 Web 服务。 Web 服务将在某个服务帐户下通过提升的权限获取所有组。 =) 你可以调用这个网络服务方法。

【讨论】:

  • 谢谢,但“/_api/Web/SiteGroups”会返回所有组,而不仅仅是我可以访问的组。这就是我最初获得庞大列表的方式。
  • @Chris G. 我的第二个建议怎么样?具有提升权限的 Web 服务。在此 Web 服务中,您可以获取每个组并检查您是否存在于该组中并返回预期结果。你怎么理解 你是否可以访问群组?如果您是组成员,那么 Web 服务确实可以帮助您。但我知道它更复杂,可能不是很好的解决方案。 =)
  • 这是一个封闭的环境。没有新的 Web 服务或服务器端代码。他们甚至不允许 powershell get 命令。因此,我需要客户端方法。但是,谢谢。
  • @ChrisG。您的代码将托管在您身边吗?在你的环境中?还是托管在 SharePoint 的客户环境中?如果是第一种情况 - 那么您始终可以在您的环境中创建服务器代码。如果是第二种情况 - 那么我现在无法提出任何建议。 =)
  • @ChrisG。使用此端点: _api/web/currentuser/groups 。它将显示用户有权访问的所有组。使用 /_api/Web/SiteGroups 获取所有组。先过滤后,你会得到你想要的。
猜你喜欢
  • 2011-11-11
  • 2020-07-24
  • 2011-07-21
  • 2014-09-11
  • 1970-01-01
  • 2019-06-30
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多