【问题标题】:Sharepoint 2013 REST API not returning all items for a listSharepoint 2013 REST API 未返回列表的所有项目
【发布时间】:2014-11-21 16:07:35
【问题描述】:

标题非常准确地说明了我的问题。如果我尝试使用 sharepoint 的 REST API 从列表中收集所有 400 多个项目,我只会得到前 100 个。

我已阅读 http://msdn.microsoft.com/en-us/library/office/dn292552(v=office.15).aspx 并在“使用 REST 处理列表项”部分中说明了这一点

以下示例显示了如何检索列表的所有项。

url: http://site url/_api/web/lists/GetByTitle(‘Test')/items

method: GET

headers: ...

我已经突出显示了所有单词,因为这不是我得到的......

我错过了什么吗?是否有一些选项我应该禁用/启用才能真正获得所有项目?

谢谢

【问题讨论】:

  • 你能展示你自己的代码吗?您是从列表中还是从特定视图中检索项目?
  • 无需代码即可看到我只收到前 100 件商品。我只通过访问浏览器中的 URL 就得到了这么多的项目(所以只需用我自己的值替换站点 url 和 http://site url/_api/web/lists/GetByTitle(‘Test')/items 中的测试,我就得到了这 100 个项目的 XML)
  • 无需代码即可查看结果,但可能需要代码才能了解原因;-)
  • (重读我的回答……听起来可能有点冒犯,对此感到抱歉:P)嗯……那我有点困惑。我真的没有它的代码。我只是简单地在 powershell 中使用这些标头 $req.headers.add("X-FORMS_BASED_AUTH_ACCEPTED", "f")$req.method = "GET"$req.Credentials = [system.net.credentialcache]::defaultcredentials 发出 GET 请求,差不多就是这样。
  • 这家伙在尝试返回站点列表时遇到了类似的问题,并通过返回批次解决了它:stackoverflow.com/questions/45025996/…

标签: rest sharepoint sharepoint-2007 sharepoint-2013


【解决方案1】:

限制是由于服务器端分页。

一种解决方法是一次检索 100 个项目,或通过输入项目计数来覆盖限制:

https://$DOMAIN/$SITE/_api/web/Lists/getByTitle('$LIST')/Items?$top=1000

请注意,在 5000 处还有一个阈值。

【讨论】:

  • 目前我没有超过 500 条记录,所以应该这样做。谢谢你的帮助^^!
  • ...不过,出于好奇,我将如何分批检索 100 件商品(以便我可以控制下一个要获取的批号)?
  • 这并不容易......也许从这里开始msdn.microsoft.com/en-us/library/office/… 然后浏览博客和论坛以找出真正有效的方法
  • 再次感谢。我去看看。
【解决方案2】:

您可以在休息调用中使用 RowLimit 和 RowsPerPage。下面是例子

$.ajax({
url: siteurl + "/_api/web/lists/getbytitle('NewList')/items",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
RowLimit : null, //Specify the row limit
RowsPerPage : null, //Specify no of rows in a page
success: function (data) {
     $('#oDataFilter').append("<table>");
     $.each(data.d.results, function(index, item){
         $('#oDataFilter').append("<tr><td class="+styleClass+">" + item.ID + "</td><td class="+styleClass+">"+ item.Title + "</td></tr>");
     });
     $('#oDataFilter').append("</table>");
},
error: function (error) {
    alert('Error getListItems :: '+JSON.stringify(error));
}

【讨论】:

  • 非常棒的例子。测试很漂亮。
【解决方案3】:

添加到Christophe's 答案我想说在列表中列出所有(可能是 5000 个)项目并解析它们会导致性能问题。

如果您查询 sharepoint 以显示特定列表中的所有项目,它只会打印出前 100 个。但是 xml 响应还提供了用于查询下一个 100 个列表项的 url。

在 xml 响应的最后你会看到这样的标签

<link rel="next" href="https://xxxxx.sharepoint.com/_api/web/lists/GetByTitle('list')/items?%24skiptoken=Paged%3dTRUE%26p_ID%3d100" />

href="...."里面的网址就是你需要的。

查询上述内容将为您提供接下来 100 个或更少项目的列表。 如果还有更多项目,则此 xml 响应将依次提供另一个 &lt;link rel="next"&gt; 标记,否则此标记将不存在。

在我看来,最好以 100 个为一组来处理 5000 个项目,而不是将它们全部放在一起。

【讨论】:

  • 我遇到的问题是 url 被编码和解码它不起作用,有解决办法吗?
【解决方案4】:

对于现在看到此内容的任何人,您可以使用data.d.__next 获取接下来的 100 件商品。使用一些好的旧递归,你可以得到所有这样的项目

function getItems(url) {
  $.ajax({
    url: url,
    type: "GET",
    headers: {
      "accept": "application/json;odata=verbose",
    },
    success: function(data) {
      console.log(data);

      // Do work

      if (data.d.__next) {
        getItems(data.d.__next);
      }
    },
    error: function(jqxhr) {
      alert(jqxhr.responseText);
    }
  });
}

【讨论】:

  • 这是否也有 5000 个项目的限制?
猜你喜欢
  • 2014-04-26
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2020-10-02
  • 2016-01-03
相关资源
最近更新 更多