如何自定义设置 angularjs jsonp 回调名称?

Posted

技术标签:

【中文标题】如何自定义设置 angularjs jsonp 回调名称?【英文标题】:how to custom set angularjs jsonp callback name? 【发布时间】:2014-10-13 14:02:32 【问题描述】:

我必须通过 angularjs 从某个网站获取 json 数据。我已根据下面的链接正确地完成了所有操作。

我的问题是api不允许回调参数有除字母、数字和_之外的任何字符。并且由于 Angular 将 JSON_CALLBACK 替换为“angular.callbacks._0”之类的内容,因此不允许这样做。

如何为 angularjs 自定义设置这个值?

parsing JSONP $http.jsonp() response in angular.js

谢谢

【问题讨论】:

@runTam 的解决方案对我有用....在这里工作 plunkr:plnkr.co/edit/EyFvXx?p=preview 【参考方案1】:

回调名称在这里是硬编码的httpBackend.js#L55,所以你不能配置它。

但是,您可以编写一个 HTTP 拦截器来解决它,如下所示:

.factory('jsonpInterceptor', function($timeout, $window, $q) 
  return 
    'request': function(config) 
      if (config.method === 'JSONP') 
        var callbackId = angular.callbacks.counter.toString(36);
        config.callbackName = 'angular_callbacks_' + callbackId;
        config.url = config.url.replace('JSON_CALLBACK', config.callbackName);

        $timeout(function() 
          $window[config.callbackName] = angular.callbacks['_' + callbackId];
        , 0, false);
      

      return config;
    ,

    'response': function(response) 
      var config = response.config;
      if (config.method === 'JSONP') 
        delete $window[config.callbackName]; // cleanup
      

      return response;
    ,

    'responseError': function(rejection) 
      var config = rejection.config;
      if (config.method === 'JSONP') 
        delete $window[config.callbackName]; // cleanup
      

      return $q.reject(rejection);
    
  ;
)

Plunker 示例: http://plnkr.co/edit/S5K46izpIxHat3gLqvu7?p=preview

希望这会有所帮助。

【讨论】:

经过测试并使用我使用 OP 引用的 API 制作的指令:plnkr.co/edit/EyFvXx?p=preview 不幸的是,并行请求两个资源时不起作用。回调 id 不会在两者之间增加,并且不会再定义第二个请求的回调:Uncaught ReferenceError: angular_callbacks_0 is not defined(参见plnkr.co/edit/TVnta6lZeaAaVC7Z8vBl)

以上是关于如何自定义设置 angularjs jsonp 回调名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 angularjs 中的 JSONP 错误回调中获取数据?

在 AngularJS 应用程序中拖放的自定义指令

在 AngularJS 中解析 JSONP 文件

在 AngularJS 中访问 JSONP 请求的真实 URL

如何使用 angularjs $http 修复我的 jsonp 回调以解决“意外令牌”错误?

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