11

I'm getting a strange behaviour with AngularJS's $http and not really understanding how transformResponse works (the docs are a bit light on this one).

    WebAssets.get = function () {
        return $http.get('/api/webassets/list', {
            transformResponse: [function (data, headersGetter) {
                // not sure what to do here?!
                return data;
            }].concat($http.defaults.transformResponse) // presume this isn't needed, added for clarity
        }).then(function (response) {
            return new WebAssets(response.data);
        });
    };

The api returns an array of objects:

[{"webasset_name": "...", "application_id": "...", "etc": "..."}, ... ]

But when transformResponse has done it's evil business the data has transformed into an indexed object:

{"0":{"webasset_name":"...","application_id":"...", "etc": "..."}, "1":....}

I want to keep the original data structure (an array of objects).

2

3 Answers 3

14

To get angular to not convert your data into an object you need to override the behavior of the default $httpProvider.defaults.transformResponse. It is actually an array of transformers. You could just set it to be empty: $http.defaults.transformResponse = []; Here is an example transformer I have used to convert 64-bit long ints to strings:

function longsToStrings(response) {
    //console.log("transforming response");
    var numbers = /("[^"]*":\s*)(\d{15,})([,}])/g;
    var newResponse = response.replace(numbers, "$1\"$2\"$3");
    return newResponse;
}

To add a transformer to the default list, say ahead of the JSON deserializer, you can do this:

$http.defaults.transformResponse.unshift(longsToStrings);
Sign up to request clarification or add additional context in comments.

Comments

3

Resource 0: "f" 1: "a" 2: "l" 3: "s" 4: "e" This finally worked for me:

   transformResponse: function (data, headersGetter) {
    return { isCorrect: angular.fromJson(data) }
    }

Comments

1

Try using resource query method

https://github.com/angular/angular.js/issues/6314

2 Comments

I think what you need to do is informing the $http that you are returning array instead of an object
Can you extend your answer with some example code? It's always clearer to see code and a description. You can edit your answer. By the way, why did you create two accounts?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.