web-dev-qa-db-ja.com

Sharepoint 2013 REST APIがリストのすべてのアイテムを返さない

タイトルは私の問題をかなり正確に述べています。 SharepointのREST APIを使用してリストから400以上のアイテムをすべて収集しようとすると、最初の100しか取得できません。

http://msdn.Microsoft.com/en-us/library/office/dn292552(v = office.15).aspx を読み、「RESTを使用してリストアイテムを操作する」で一部、彼らはそれを述べています

次の例は、リストのアイテムのallを取得する方法を示しています。

url: http://site url/_api/web/lists/GetByTitle(‘Test')/items

method: GET

headers: ...

私はWordをすべて強調表示しましたが、それは私が得ているものではないためです...

何か不足していますか?本当にすべてのアイテムを取得するために無効/有効にする必要があるオプションはありますか?

ありがとう

11
leopik

制限はサーバー側のページングによるものです。

回避策は、一度に100アイテムを取得するか、アイテムの数を入力して制限を上書きすることです。

https://$DOMAIN/$SITE/_api/web/Lists/getByTitle('$LIST')/Items?$top=1000

5000にもしきい値があることに注意してください。

29
Christophe

Christophe's 回答に追加するすべての(潜在的に5000の)アイテムをリストにリストし、それらを解析すると、パフォーマンスの問題が発生すると言います。

特定のリスト内のすべてのアイテムを表示するためにSharePointにクエリを実行すると、最初の100のみが出力されます。ただし、xml応答は、次の100のリストアイテムをクエリするためのURLも提供します。

Xml応答の最後に、次のようなタグが表示されます

<link rel="next" href="https://xxxxx.sharepoint.com/_api/web/lists/GetByTitle('list')/items?%24skiptoken=Paged%3dTRUE%26p_ID%3d100" />

href="...."内のURLが必要になります。

上記のクエリを実行すると、次の100個以下のアイテムのリストが提供されます。まだアイテムが残っている場合、このxml応答は別の<link rel="next">タグを提供し、存在しない場合、このタグは存在しません。

私の意見では、5000個のアイテムをまとめて処理するよりも、100個のセットで処理する方が良いでしょう。

2
mouserat

RestLimitでRowLimitとRowsPerPageを使用できます。以下は例です

$.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) {
     $('#oDataFilter').append("<table>");
     $.each(data.d.results, function(index, item){
         $('#oDataFilter').append("<tr><td class="+styleClass+">" + item.ID + "</td><td class="+styleClass+">"+ item.Title + "</td></tr>");
     });
     $('#oDataFilter').append("</table>");
},
error: function (error) {
    alert('Error getListItems :: '+JSON.stringify(error));
}
2
Nishkalank

今これを見ている人なら誰でもdata.d.__next次の100アイテムを取得します。古き良き再帰を使用すると、すべてのアイテムをそのように取得できます

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