使用$skip与SharePoint 2013 REST API

13

对不起,我对使用REST非常陌生。

目前,我正在使用SP2013 Odata (_api/web/lists/getbytitle('<list_name>')/items?)来获取列表的内容。该列表中有199个项目,因此我需要调用两次,并每次请求不同的项目集。我认为我可以通过调用以下内容来实现:

_api/web/lists/getbytitle('<list_name>')/items?$skip=100&$top=100

每次更改需要跳过的数量,但问题是它只返回前100个项目。我是否做错了什么或者在 OData 服务中 $skip 已经失效了?

如果这种方式不起作用或不实用,是否有更好的迭代 REST 调用的方法?

我正在使用带有Accept标头等于application/json;odata=verbose的 JSon 协议

我想 $top=100 实际上并不必要

编辑:我查阅了更多资料,这里的术语我不能完全确定,但是如果你使用的是 SharePoint 2010 引入的方法,例如 _vti_bin/ListData.svc/<list_name>?$skip=100,那么使用 $skip 是没问题的。

实际上,有趣的是,旧方法没有设置100项限制以返回结果,因此根本不需要跳过($skip)。但是,如果您想仅返回特定的数据段,那么需要执行以下操作:

_vti_bin/ListData.svc/<list_name>?$skip=x&$top=(x+y)

每次循环时,您都会有类似于 x+=y 的内容。

您可以使用我上面描述的旧方法,或查看下面的答案,了解如何使用SP2013 OData来实现此操作的说明。

2个回答

13

好的,我已经想通了。 $skip 并不是在 items? 级别上使用的命令。它只能在 lists? 级别上使用。但事实上,有一种方法可以做到这一点,而且比我原来想的要容易得多。

如果您只想要所有数据

在返回的数据中,假设您调用的列表包含超过100个项目,则会在d/__next(假设您使用json)处有一个 __next 。这个__next (注意,它是双下划线。我一开始遇到了一些问题,因为我试图获取d/_next ,但从未返回任何内容) 是正确的url可以获取下一组条目。__next将始终是一个值,如果有其他可用的项集合可供获取。

最后我创建了一个 RequestURL 变量,最初设置为原始请求,但在循环结束时更改为 d/__next 。然后,循环检查 RequestURL 是否为空才进入循环。

请原谅我缺乏代码,我正在使用SharePoint Designer 2013制作此代码,语法并不是特别详细。

如果您只想要少量数据

可能有几种情况,您每次通过循环只想要 x 行列表,并且这也很容易做到。

如果在请求中添加一个$top=x 参数,则响应返回的 __next url 将为您提供列表中下一个x行。最终,当没有行可返回时,将不会随响应返回__next


1
如果我想要实现之前的功能,我该如何做到?有什么建议吗? - Rahul Gokani
1
由于$skiptoken是基于ID的,因此在执行服务器端过滤和分页时,请谨慎处理。 - Kode

2

请记住,为了使用__next,您需要拥有一个

$skiptoken=Paged=TRUE 

在URL中也可以包含。

虽然这不应该是一个单独的答案,但至少在SP2013上这是关键信息。我曾经因为它没有返回任何__next属性而感到沮丧,直到我发现了这个问题。 - Soren Bjornstad
1
在SP2016中似乎不需要它。__next可以在没有它的情况下使用。 - th1rdey3

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