angular Jsonp的坑


  angular 為了解決跨域問題 一些第三方接口會提供jsonp來調用,需要使用callback=JSON_CALLBACK來處理 

  這個時候問題來了,有些借口是不支持callback里面帶有點語法的,最典型的就是豆瓣了,而callback=JSON_CALLBACK 會被 angular轉換成 callback = angular.callbacks._[id]這種形式,

  這個時候就會報錯了,因為返回的是json格式而不是jsonp格式。為了解決這類問題最簡單的方法肯定是重定義方法名,我在這里就是采用這種方法的,但是我們應該怎么改名字呢?答案就是在http攔截器里面,詳情看代碼。  

https://api.douban.com/v2/book/isbn/' + isbn + "/reviews?callback=JSON_CALLBACK"
  .factory("httpInterceptor", ["App", "$rootScope", '$injector','$timeout', function (App, $rootScope, $injector,$timeout) {return {
            request: function (config) {
                if (config.method === 'JSONP') {
                    console.log(config);
                    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);
                }
                if (!config.isLoading) {
                    count++;
                    $rootScope.$broadcast('loading:show')
                }
                return config || App.q.when(config);
            },
            requestError: function (rejection) {               return App.q.reject(rejection)
            },
            response: function (response) {
               return response || App.q.when(response);
            },
            responseError: function (rejection) {// do something on response error
                return App.q.reject(rejection);
            }
        }
    }])

  就是以上代碼進行方法名更改了。

  以上思路來源於 http://stackoverflow.com/questions/25400891/how-to-custom-set-angularjs-jsonp-callback-name


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM