SharePoint 2013 REST API не возвращает все элементы для списка
в названии говорится о моей проблеме совершенно точно. Если я попытаюсь собрать все 400 + элементов из списка с помощью REST API sharepoint, я получу только первые 100.
Я прочитал http://msdn.microsoft.com/en-us/library/office/dn292552 (v=офис.15).aspx и в части "работа с элементами списка с помощью REST" они заявляют, что
В следующем примере показано, как получить все элементов списка.
url: http://site url/_api/web/lists/GetByTitle(‘Test')/items
method: GET
headers: ...
я выделил слово все, потому что это не то, что я получаю ...
Я что-то пропустила? Есть ли какой-то вариант, который я должен отключить/включить, чтобы получить действительно все элементы?
спасибо
4 ответов
ограничение связано с подкачкой на стороне сервера.
обходной путь состоит в том, чтобы получить 100 элементов одновременно или переопределить ограничение, введя количество элементов:
https://$DOMAIN/$SITE/_api/web/Lists/getByTitle('$LIST')/Items?$top=1000
обратите внимание, что существует также порог в 5000.
вы можете использовать RowLimit & RowsPerPage в вызове rest. Ниже приведен пример
$.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) {
$.each(data.d.results, function(index, item){
$('#oDataFilter').append("<tr>" + "<td class="+styleClass+">" + item.ID + "</td>" + "<td class="+styleClass+">"+ item.Title + "</td>" + "</tr>");
});
},
error: function (error) {
alert('Error getListItems :: '+JSON.stringify(error));
}
добавлять к Кристоф!--5--> ответ я бы сказал, что перечисление всех (потенциально 5000) элементов в списке и их разбор приведет к проблемам с производительностью.
Если вы запросите sharepoint, чтобы показать все элементы в определенном списке, он распечатает только первые 100. Но ответ xml также предоставляет url-адрес для запроса следующих 100 элементов списка.
в самом конце ответа xml вы увидите тег, как это
<link rel="next" href="https://xxxxx.sharepoint.com/_api/web/lists/GetByTitle('list')/items?%24skiptoken=Paged%3dTRUE%26p_ID%3d100" />
url внутри href="...."
это то, что вам нужно.
запрос выше предоставит вам список следующих 100 или менее элементов.
Если осталось еще больше элементов, этот xml-ответ, в свою очередь, предоставит другой <link rel="next">
тег, а если нет, этот тег не будет существовать.
лучше обрабатывать 5000 предметов в наборах из 100, а не их все вместе, на мой взгляд.
для тех, кто сейчас это видит, вы можете использовать data.d.__next
чтобы получить следующие 100 товаров. Используя некоторую старую добрую рекурсию, вы можете получить все элементы, такие как so
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);
}
});
}