AngularJS, $http и transformResponse
Я получаю странное поведение с AngularJS $http и не понимаю, как работает transformResponse (документы немного освещены на этом).
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);
});
};
Api возвращает массив объектов:
[{"webasset_name": "...", "application_id": "...", "etc": "..."}, ... ]
Но когда transformResponse сделал это злое дело, данные превратились в индексированный объект:
{"0":{"webasset_name":"...","application_id":"...", "etc": "..."}, "1":....}
Я хочу сохранить исходную структуру данных (массив объектов).
Ответы
Ответ 1
Чтобы получить angular, чтобы не преобразовать ваши данные в объект, вам необходимо переопределить поведение по умолчанию $httpProvider.defaults.transformResponse. На самом деле это массив трансформаторов.
Вы можете просто установить его как пустую: $http.defaults.transformResponse = [];
Вот пример трансформатора, который я использовал для конвертирования 32-битных длинных ints в строки:
function longsToStrings(response) {
//console.log("transforming response");
var numbers = /("[^"]*":\s*)(\d{15,})([,}])/g;
var newResponse = response.replace(numbers, "$1\"$2\"$3");
return newResponse;
}
Чтобы добавить трансформатор в список по умолчанию, скажем, перед десериализатором JSON, вы можете сделать это:
$http.defaults.transformResponse.unshift(longsToStrings);
Ответ 2
Ресурс 0: "f" 1: "a" 2: "l" 3: "s" 4: "e"
Это, наконец, помогло мне:
transformResponse: function (data, headersGetter) {
return { isCorrect: angular.fromJson(data) }
}
Ответ 3
Попробуйте использовать метод запросов ресурсов
https://github.com/angular/angular.js/issues/6314