Pergunta

Estou tentando fazer paginação em uma biblioteca de documentos (também tentando isso em uma lista) com SP 2013 usando REST/OData, mas não consigo obter o pulando de itens funcionando.

Aqui estão alguns exemplos de URLs que estou testando em meu próprio farm SP 2013 e também não funcionam em meu farm Office 365 2013 Dev Preview.Os resultados são retornados e $top e $orderby funcionam bem, mas nunca ignoram nenhum item.ou sejaPosso retirar $skip do URL e obtenho o mesmo resultado.

http://sp15/_api/web/lists/GetByTitle('FAQ')/Items?$skip=2&$top=2&$orderby=ID
http://sp15/_api/web/lists/GetByTitle('FAQ')/Items?$skip=2
http://sp15/_api/web/lists/GetByTitle('FAQ')/Items?$skip=2&$top=2

http://sp15/_api/web/lists/GetByTitle('Documents')/Items?$skip=2&$top=2&$orderby=ID
http://sp15/_api/web/lists/GetByTitle('Documents')/Items?$skip=2&$top=2&$orderby=ID desc

etc.

Alguma idéia do que estou fazendo de errado?

Foi útil?

Solução

Não estou familiarizado com REST, mas tente a sintaxe antiga:Exemplo:*http://sp15/_vti_bin/ListData.svc/FAQ?$skip=4&$top=2*

Outras dicas

Atualmente $skip opção de consulta é não compatível com SharePoint 2013/Online.

De acordo com Usar operações de consulta OData em solicitações REST do SharePoint:

O $skip a opção de consulta não funciona com consultas do SharePoint lista de itens.

Mas você poderia utilizar $skiptoken opção de consulta para retornar resultados paginados conforme demonstrado abaixo.

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

Exemplo

O exemplo demonstra como recuperar a contagem limitada de itens (2 itens) com id igual ou superior 2 de Pages biblioteca:

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);
    }   
});

onde

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);
}

Vejo o mesmo problema no SP2013 online com o novo endpoint OData V3 _api.Para operação CRUD, talvez seja melhor usar o endpoint OData v2 listdata.svc por enquanto.

A resposta de Vadim está muito próxima, mas sua string de consulta está um pouco errada.O problema não é realmente dele, é da Microsoft, pois eles não estão sendo consistentes com o escape de seu URI.

Usei a extensão Postman para Chrome e examinando o valor __next retornado ao usar $top (que é uma abordagem alternativa que vale a pena considerar), percebi que há um e comercial que não escapa corretamente nos valores __next.Usando essa abordagem, consegui fazer com que a paginação com chamadas REST OData de 2013 funcionasse.Aqui está o código relevante para usar em conjunto com a resposta de Vadim.

var queryString = "?%24skiptoken=Paged%3DTRUE%26p_ID%3D" + (startItemId - 1) + '&%24top=' + itemCount;

Na minha experiência, nenhuma das soluções acima funciona - pode ser porque eu estava tentando fazer isso usando uma lista externa.Para implementar a paginação, adicionei ?$skiptoken=Paged=TRUE&$top=100 ao final do URI.O URI da próxima página será incluído em JSON.d.__next.Quando a última página for alcançada, __next não estará presente

O parâmetro $skip não funciona no SharePoint 2013 para itens de lista.Funciona apenas para coleta de dados (como coleções de listas, etc.).Veja meu comentário no final deste artigo:http://msdn.microsoft.com/library/d4b5c277-ed50-420c-8a9b-860342284b72.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top