Просмотр документации по API Sharepoint (находится здесь: 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 отсюда.

4
Daniel 10 Окт 2014 в 22:27

2 ответа

Лучший ответ

Указан протокол OData V4 (ссылка на 11.2.5.7 разбиение на страницы, управляемое сервером), что:

Службы OData могут использовать зарезервированный системный параметр запроса $ skiptoken при создании следующих ссылок. Его содержание непрозрачно, зависит от службы и должно соответствовать правилам только для частей запроса URL. Клиенты OData НЕ ДОЛЖНЫ использовать параметр системного запроса $ skiptoken при создании запросов.

Таким образом, реализация O365 SharePoint API, в которой он публикует $ skiptoken в качестве параметра запроса, который клиент должен использовать для исключения первых нескольких элементов из запрашиваемой коллекции, является нарушением протокола. Для такого сценария клиент должен использовать $ skip. Но из прилагаемой спецификации O365 кажется, что $ skip не реализован.

Если вы запрашиваете набор сущностей службы O365, а полезная нагрузка ответа содержит следующую ссылку (аннотацию @odata.nextLink в объекте JSON ответа), это указывает на то, что служба имеет подкачку на стороне сервера для набора сущностей. Обычно следующая ссылка представляет собой URL-адрес, содержащий параметр запроса $ skiptoken, например http://host/service/entityset?$skiptoken=n, который клиент может использовать для получения следующей страницы.

2
Yi Ding - MSFT 11 Окт 2014 в 12:33
Спасибо! К сожалению, похоже, кроме $skip, нет реализации $search и $filter.
 – 
Daniel
14 Окт 2014 в 17:27
1
В настоящее время служба поддерживает пейджинг вперед только с использованием токена $skiptoken и следующей ссылки. Известно, что функционал $skip пока недоступен в сервисе. Команда разработчиков знает об этом запросе.
 – 
Michael Mainer
14 Окт 2014 в 21:51
@MichaelMainer-Microsoft, эта функция так и не появилась в 2013 году. Каков рекомендуемый способ реализации подкачки? Использовать _vti_bin/ListData.svc?
 – 
John Palmer
16 Окт 2014 в 02:37
Что ж, оказывается, $filter реализован, в отличие от того, что я указал выше, но многие функции, которые будут использоваться с ним, не реализованы и доступны для использования только в определенных столбцах. Жаль, однако, что мне приходится так много глубоко копаться в документации и экспериментировать, чтобы понять это, вместо того, чтобы иметь один четкий документ, в котором изложено то, что доступно.
 – 
Daniel
16 Окт 2014 в 20:57
Палмер, я только сейчас изучаю API SharePoint для O365. Я не уверен в API для 2013 года.
 – 
Michael Mainer
17 Окт 2014 в 03:28

В настоящее время параметр запроса $skip не поддерживается в интерфейсе REST SharePoint 2013 / Online. Но вы можете использовать REST-интерфейс SharePoint 2010 для получения результатов с разбивкой на страницы с помощью параметра запроса $skip, например:

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

Как использовать параметр запроса $skiptoken в интерфейсе REST SharePoint 2013 / Online

Формат: $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);
}
0
Vadim Gremyachev 19 Янв 2015 в 19:36