Sharepoint 2013的REST API未返回列表中的所有项目

13

这个标题非常准确地描述了我的问题。如果我尝试使用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: ...

我已经突出了所有这个词,因为那不是我得到的...

我是否遗漏了什么? 是否有一些选项我应该禁用/启用以获取真正的所有项目?

谢谢


1
你能展示一下你自己的代码吗?你是从列表中检索项目还是从特定视图中检索? - Christophe
不需要代码来查看结果,但可能需要代码来理解为什么;-) - Christophe
我明白,我实际上是指REST URL本身。看起来你正在使用列表而不是视图。 - Christophe
URL本身看起来像https://$DOMAIN/$SITE/_api/web/Lists/getByTitle('$LIST')/Items - leopik
1
这个人在尝试返回网站列表时遇到了类似的问题,并通过返回批次来解决它:https://stackoverflow.com/questions/45025996/getting-sharepoint-list-content-types - bgmCoder
显示剩余3条评论
4个回答

34

这个限制是由于服务器端分页导致的。

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

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

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


目前我的记录不超过500条,所以这应该足够了。谢谢你的帮助^^! - leopik
不过,仅出于好奇,我如何分批检索100个项目(以便我可以控制要获取的下一批号码)? - leopik
2
这并不容易...也许可以从这里开始:http://msdn.microsoft.com/en-us/library/office/fp142385(v=office.15).aspx#sectionSection6,然后浏览博客和论坛,找出实际可行的方法。 - Christophe
再次感谢。我会看一下的。 - leopik

3
您可以在REST调用中使用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));
}

非常棒的例子。测试结果非常好。 - vapcguy

2
补充Christophe的答案,我想说如果将所有(可能达到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="...."”中的URL是您需要的。
查询上述内容将为您提供下一个100个或更少项目的列表。如果还有更多的项目,此xml响应将依次提供另一个“”标签;如果没有,则该标签不存在。
我认为最好将5000个项目分成100个一组处理,而不是一起处理所有项目。

我遇到了一个问题,URL被编码后解码无法正常工作,有什么解决方法吗? - JoseCarlosPB

1

对于现在看到这篇文章的任何人,您可以使用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项的限制吗? - Jilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接