angular 爲了解決跨域問題 一些第三方接口會提供jsonp來調用,須要使用callback=JSON_CALLBACK來處理 angularjs
這個時候問題來了,有些藉口是不支持callback裏面帶有點語法的,最典型的就是豆瓣了,而callback=JSON_CALLBACK 會被 angular轉換成 callback = angular.callbacks._[id]這種形式,json
這個時候就會報錯了,由於返回的是json格式而不是jsonp格式。爲了解決這類問題最簡單的方法確定是重定義方法名,我在這裏就是採用這種方法的,可是咱們應該怎麼更名字呢?答案就是在http攔截器裏面,詳情看代碼。 api
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-namejsonp