我在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":....}
我想保留原始数据结构(对象数组)。
为了使角度不将数据转换为对象,您需要覆盖默认$ httpProvider.defaults.transformResponse的行为。它实际上是一组变压器。您可以将其设置为空:$http.defaults.transformResponse = []; 这是我用来将64位长整数转换为字符串的示例转换器:
$http.defaults.transformResponse = [];
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);