如何在AngularJS之前插入命令或阻止$ http的JSONP自动解析?

时间:2013-06-27 01:04:14

标签: javascript angularjs jsonp

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

编辑:问题在于我需要使用JSONP方法从其他网站请求信息,但数据没有预期的JSONP回调所以(I我仍然不确定它的浏览器是基于内容还是基于AngularJS代码而引发语法错误。

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

3 个答案:

答案 0 :(得分: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 here的更多信息。

答案 1 :(得分: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转换函数。

答案 2 :(得分:0)

Angular has added $jsonpCallbacks in version 1.5.8 https://github.com/angular/angular.js/blob/master/src/ng/jsonpCallbacks.js

This allows you to modify the callback function.