16

我发现的关于 $http 或 angularjs 的几乎所有问题或解释似乎都假设您可以修改请求的响应。我不能这样做,而且我得到的响应格式不正确(根据 AngularJS 解析器)。它以一致的方式格式错误,因此我可以在解析之前修改纯文本以解决问题,但是响应拦截器和转换响应函数都发生在默认(基于内容类型?)解析之后。

编辑:问题在于我需要使用 JSONP 方法从另一个站点请求信息,但数据没有预期的 JSONP 回调所以某些东西(我仍然不确定它是否基于浏览器在内容或 AngularJS 代码上)会引发语法错误。

新问题:有人知道解决这个问题的方法吗?

4

3 回答 3

8

这已经过测试并且确实有效。如果您还有其他问题,请告诉我。http://jsfiddle.net/moderndegree/Kn3Tc/

HTML

<div ng-app="myApp">
    <div ng-controller="myController">
        {{results.tada}}
    </div>
</div>

Javascript

angular.module('myApp', ['ngResource']).
factory('myService', function($http, $resource, $log){
    return $resource('/', {}, {
        get: {
            method: 'GET',
            // placed custom transform ahead of $http default
            transformRequest: [function(data, headersGetter){
                $log.info(data);
                $log.info(headersGetter());
            }].concat($http.defaults.transformRequest),
            // placed custom transform ahead of $http default
            transformResponse: [function (data, headersGetter) {
                $log.info(data);
                $log.info(headersGetter());
                data = {tada:"Check your console"};
                return data;
            }].concat($http.defaults.transformResponse)
        }
    });
}).
controller('myController', function(myService, $scope) {
    $scope.results = myService.get();
});

更新 要使用 JSONP,只需将方法切换到 JSONP。您可以在此处阅读有关 ngResource的更多信息。

于 2013-06-27T01:19:15.920 回答
1

这是角度文档所说的

要全局扩充或覆盖默认转换,请修改 $httpProvider.defaults.transformRequest 和 $httpProvider.defaults.transformResponse 属性。默认情况下,这些属性是一组转换函数,允许您将新的转换函数推送或取消转换到转换链中。您还可以决定完全覆盖任何默认转换,方法是直接将转换函数分配给这些属性,而不使用数组包装器。

基本上你需要做的是配置 $httpProvider

angular.module('myApp', [])
    .config(['$httpProvider', function ($httpProvider) {
//Define your transform function
//push your trasform function to the start of the array  $httpProvider.defaults.transformResponse
//Or replace the transformResponse array with a function or a new array of tranform functions.

}]);

现在,您实现的 trasform 函数应该是数组中的第一个函数。因为那里已经有一个字符串到 JSON 转换函数。

于 2013-06-27T03:41:21.603 回答
0

Angular 在 1.5.8 版本中添加了 $jsonpCallbacks https://github.com/angular/angular.js/blob/master/src/ng/jsonpCallbacks.js

这允许您修改回调函数。

于 2016-08-31T18:24:37.757 回答