Office 365 Sharepoint API $ skip / $ skiptoken功能

时间:2014-10-10 18:27:25

标签: odata office365

浏览Sharepoint API的文档(位于此处:http://msdn.microsoft.com/en-us/library/office/dn605900(v=office.15).aspx)我试图弄清楚如何选择文档块。我期待$ skip可以工作,因为它暗示大多数OData功能应该存在,但这不起作用。我也无法弄清楚$ skiptoken是否是一个有效的查询参数。它列在底部附近的文档中(没有进一步说明),但到目前为止我无法哄骗它的正确结果。

如果有人知道$ skip或$ skiptoken或其他可用于获取分块响应的方法,那么帮助解决这个问题会很棒!

编辑:澄清一下,像API_URL / files这样的东西?$ orderby = url& $ top = 5工作,但像API_URL / files这样的东西?$ orderby = url& $ skip = 50却没有。但是,我刚刚在响应中找到了一个“下一个”URL,它似乎提供了服务器端分页支持。我会试着从这里弄清楚使用$ skiptoken。

2 个答案:

答案 0 :(得分:2)

OData V4协议已指定(引用11.2.5.7 Server-Driven Paging):

  

在构建下一个链接时,OData服务可以使用保留的系统查询选项$ skiptoken。其内容不透明,特定于服务,并且只能遵循URL查询部分的规则。   在构造请求时,OData客户端绝不能使用系统查询选项$ skiptoken。

因此,它发布$ skiptoken作为客户端用于排除查询集合中前几个项目的查询选项的O365 SharePoint API的实现违反了协议。客户端应该使用$ skip来实现这种情况。但是从你附上的O365规范看来,$ skip没有实现。

如果查询O365服务的实体集并且响应有效内容包含下一个链接(响应JSON对象中的@odata.nextLink注释),则表明该服务具有该实体的服务器端分页组。通常,下一个链接是一个包含$ skiptoken查询选项的URL,例如客户端可用于获取下一页的http://host/service/entityset?$skiptoken=n

答案 1 :(得分:0)

SharePoint 2013 / Online REST界面中当前$skip查询选项。但您可以使用SharePoint 2010 REST界面使用$skip查询选项检索分页结果,例如:

https://contoso.sharepoint.com/_vti_bin/ListData.svc/Pages?$skip=2&$top=2

如何在SharePoint 2013 / Online REST界面中使用$skiptoken查询选项

格式:$skiptoken=Paged=TRUE&p_ID=<last item id to skip>&$top=<items count>

示例

该示例演示了如何从2库中检索有限数量的项目(2个项目等于或大于Pages):

function getPagedItems(webUrl,listTitle,startItemId,itemsCount)
{
    var endpointUrl = webUrl + "/_api/web/lists/getbytitle('" + listTitle +  "')/items?$skiptoken=" + encodeURIComponent('Paged=TRUE&p_SortBehavior=0&p_ID=' + (startItemId-1) + '&$top=' + itemsCount);
    return executeRequest(endpointUrl,'GET');
}


getPagedItems('https://contoso.sharepoint.com/','Pages',2,2)
.done(function(data){
    if(data.d.results.length == 0){
        console.log('Items not found');
        return;
    }
    for(var i = 0; i < data.d.results.length; i++){
        var item = data.d.results[i];
        console.log(item.Title);
    }   
});

,其中

function executeRequest(url,method,headers,payload) 
{
    if (typeof headers == 'undefined'){
        headers = {};
    }
    headers["Accept"] = "application/json;odata=verbose";
    if(method == "POST") {
        headers["X-RequestDigest"] = $("#__REQUESTDIGEST").val();
    }   

    var ajaxOptions = 
    {       
       url: url,   
       type: method,  
       contentType: "application/json;odata=verbose",
       headers: headers
    };
    if(method == "POST") {
      ajaxOptions.data = JSON.stringify(payload);
    }  

    return $.ajax(ajaxOptions);
}