web-dev-qa-db-fra.com

Sharepoint 2013 REST ne renvoie pas tous les éléments d'une liste

Le titre énonce mon problème assez exactement. Si j'essaie de rassembler les 400+ éléments d'une liste à l'aide de l'API REST REST sharepoint, j'obtiens seulement les 100 premiers.

J'ai lu http://msdn.Microsoft.com/en-us/library/office/dn292552 (v = office.15) .aspx et dans "Travailler avec des éléments de liste en utilisant REST" partie, ils déclarent que

L'exemple suivant montre comment récupérer tous les éléments d'une liste.

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

method: GET

headers: ...

J'ai mis en surbrillance Word tout, parce que ce n'est pas ce que je reçois ...

Suis-je en train de manquer quelque chose? Existe-t-il une option que je devrais désactiver/activer pour obtenir vraiment tous les éléments?

Merci

11
leopik

La limitation est due à la pagination côté serveur.

Une solution de contournement consiste à récupérer 100 éléments à la fois ou à remplacer la limitation en saisissant un nombre d'éléments:

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

Notez qu'il existe également un seuil à 5000.

29
Christophe

Ajouter à Christophe réponse, je dirais que répertorier tous les éléments (potentiellement 5000) dans une liste et les analyser entraînerait des problèmes de performances.

Si vous interrogez sharepoint pour afficher tous les éléments d'une liste particulière, il n'imprimera que les 100 premiers. Mais la réponse xml fournit également l'URL pour interroger les 100 éléments de liste suivants.

À la toute fin de la réponse xml, vous verrez une balise comme celle-ci

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

L'URL à l'intérieur href="...."est ce dont vous aurez besoin.

En interrogeant ce qui précède, vous obtiendrez une liste des 100 éléments suivants ou moins. S'il reste encore plus d'éléments, cette réponse xml fournirait à son tour un autre <link rel="next"> tag et sinon ce tag n'existera pas.

Mieux vaut manipuler 5000 articles dans des ensembles de 100 plutôt que tous ensemble à mon avis.

2
mouserat

Vous pouvez utiliser RowLimit & RowsPerPage dans l'appel de repos. Voici l'exemple

$.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

Pour tous ceux qui voient maintenant cela, vous pouvez utiliser data.d.__next pour obtenir les 100 éléments suivants. En utilisant une bonne vieille récursivité, vous pouvez obtenir tous les éléments comme ça

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
Marshall Grimmett