Paginação usando REST/OData com SP 2013
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?
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