web-dev-qa-db-fra.com

Restangulaire: getList avec un objet contenant un tableau intégré

Dans mon projet AngularJS, j'essaie d'utiliser la méthode Restangular getList, mais elle renvoie une erreur car la réponse de l'API n'est pas directement un tableau mais un objet contenant un tableau.

{
  "body": [
    // array elements here
  ],
  "paging": null,
  "error": null
}

Le message d'erreur Restangular est:

Error: Response for getList SHOULD be an array and not an object or something else

Est-il possible de dire à Restangular que le tableau qu'il recherche se trouve à l'intérieur de la propriété body?

21
Guilhem Soulas

Oui, voir Documentation Restangular . Vous pouvez configurer Restangular comme ceci:

rc.setResponseExtractor(function(response, operation) {
    if (operation === 'getList') {
        var newResponse = response.body;
        newResponse.paging = response.paging;
        newResponse.error = response.error;
        return newResponse;
    }
    return response;
});

Edit : Il semble que l'API de Restangular soit maintenant améliorée, et que la méthode actuelle à utiliser est addResponseInterceptor . Certains ajustements peuvent être nécessaires pour la fonction passée.

22
Mikke

Je pense que vous devriez utiliser le customGET du Méthodes personnalisées

Restangular.all("url").customGET(""); // GET /url and handle the response as an Object

19
Thram

comme Collin Allen vous a suggéré d'utiliser addResponseInterceptor comme ceci:

    app.config(function(RestangularProvider) {

        // add a response intereceptor
        RestangularProvider.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
          var extractedData;
          // .. to look for getList operations
          if (operation === "getList") {
            // .. and handle the data and meta data
            extractedData = data.body;
            extractedData.error = data.error;
            extractedData.paging = data.paging;
          } else {
            extractedData = data.data;
          }
          return extractedData;
        });

});
6
Ouadie