AngularJS實現(xiàn)的JSONP跨域訪問數(shù)據(jù)傳輸功能詳解
本文實例講述了AngularJS實現(xiàn)的JSONP跨域訪問數(shù)據(jù)傳輸功能。分享給大家供大家參考,具體如下:
大家會自然想到只有一個字母之差的JSON吧~
JSON(JavaScript Object Notation)和JSONP(JSON with Padding)雖然只有一個字母的差別,但其實他們根本不是一回事兒
JSON是一種數(shù)據(jù)交換格式,而JSONP是一種依靠開發(fā)人員的聰明才智創(chuàng)造出的一種非官方跨域數(shù)據(jù)交互協(xié)議。我們拿最近比較火的諜戰(zhàn)片來打個比方,JSON是地下黨們用來書寫和交換情報的“暗號”,而JSONP則是把用暗號書寫的情報傳遞給自己同志時使用的接頭方式??吹?jīng)]?一個是描述信息的格式,一個是信息傳遞雙方約定的方法。
瀏覽器是存在同源策略這個機制的,在全局層面禁止了頁面加載或執(zhí)行與自身來源不同的域的任何腳本。
JSONP是一種可以繞過瀏覽器的安全限制,從不同的域請求數(shù)據(jù)的方法。
Web頁面上調(diào)用js文件時則不受是否跨域的影響(不僅如此,我們還發(fā)現(xiàn)凡是擁有”src”這個屬性的標簽都擁有跨域的能力,比如<script>、<img>、<iframe>);
如果想通過純web端(ActiveX控件、服務(wù)端代理、屬于未來的HTML5之Websocket等方式不算)跨域訪問數(shù)據(jù)就只有一種可能,那就是在遠程服務(wù)器上設(shè)法把數(shù)據(jù)裝進js格式的文件里,供客戶端調(diào)用和進一步處理;JSON的純字符數(shù)據(jù)格式可以簡潔的描述復(fù)雜數(shù)據(jù),被js原生支持,所以在web客戶端通過與調(diào)用腳本一模一樣的方式,來調(diào)用跨域服務(wù)器上動態(tài)生成的js格式文件(一般以JSON為后綴),顯而易見,服務(wù)器之所以要動態(tài)生成JSON文件,目的就在于把客戶端需要的數(shù)據(jù)裝入進去。為了便于客戶端使用數(shù)據(jù),逐漸形成了一種非正式傳輸協(xié)議,人們把它稱作JSONP,該協(xié)議的一個要點就是允許用戶傳遞一個callback參數(shù)給服務(wù)端,然后服務(wù)端返回數(shù)據(jù)時會將這個callback參數(shù)作為函數(shù)名來包裹住JSON數(shù)據(jù),這樣客戶端就可以隨意定制自己的函數(shù)來自動處理返回數(shù)據(jù)了。
JSONP的原理是通過<script>標簽發(fā)起一個GET請求來取代XHR請求。JSONP生成一個<script>標簽并插到DOM中,然后瀏覽器會接管并向src屬性所指向的地址發(fā)送請求。
當服務(wù)器返回請求時,響應(yīng)結(jié)果會被包裝成一個JavaScript函數(shù),并由該請求所對應(yīng)的回調(diào)函數(shù)調(diào)用。
AngularJS在http服務(wù)中提供了一個JSONP輔助函數(shù)。通過http服務(wù)中提供了一個JSONP輔助函數(shù)。通過http服務(wù)的jsonp方法可以發(fā)送請求,如下所示:
$http .jsonp("https://api.github.com?callback=JSON_CALLBACK") .success(function(data) { // 數(shù)據(jù) });
當請求被發(fā)送時,AngularJS會在DOM中生成一個如下所示的<script>標簽:
<script src="https://api.github.com?callback=angular.callbacks._0" type="text/javascript"></script>
注意,JSON_CALLBACK被替換成了一個特地為此請求生成的自定義函數(shù)。當支持JSOPN的服務(wù)器返回數(shù)據(jù)時,數(shù)據(jù)會被包裝在由AngularJS生成的具名函數(shù)angular.callbacks._0中在這個例子中,GitHub服務(wù)器會返回包含在回調(diào)函數(shù)中的JSON數(shù)據(jù),響應(yīng)看起來如下所示:
// 簡寫 angular.callbacks._0({ 'meta': { 'X-RateLimit-Limit': '60', 'status': 200 }, 'data': { 'current_user_url': 'https://api.github.com/user' } })
當AngularJS調(diào)用指定的回調(diào)函數(shù)時會對$http的promise對象進行resolve。當我們自己開發(fā)支持JSONP的后端服務(wù)時,要確保響應(yīng)的數(shù)據(jù)被包含在請求所指定的回調(diào)函數(shù)中。使用JSONP需要意識到潛在的安全風險。首先,服務(wù)器會完全開放,允許后端服務(wù)調(diào)用應(yīng)用中的任何JavaScript。不受我們控制的外部站點(或者蓄意攻擊者)可以隨時更改腳本,使我們的整個站點變得脆弱。服務(wù)器或中間人有可能會將額外的JavaScript邏輯返回給頁面,從而將用戶的隱私數(shù)據(jù)暴露出來。由于請求是由<script>標簽發(fā)送的,所以只能通過JSONP發(fā)送GET請求。并且腳本的異常也很難處理。使用JSONP一定要謹慎,同時只跟信任并可以控制的服務(wù)器進行通信。
一句話就是利用script標簽繞過同源策略,獲得一個類似這樣的數(shù)據(jù),jsonpcallback是頁面存在的回調(diào)方法,參數(shù)就是想得到的json。
Jquery中jsonp的使用
myUrl = "http://localhost:8090/api/test"; $.ajax({ type:"GET", url:myUrl, dataType:"jsonp", jsonp:"callback", jsonpCallback:"jsonpCallback", success:function(data){ alert(data.msg); } }); function jsonpCallback(data){ alert(data); }
1.jsonp只能使用get請求,解決同源問題,返回javascript代碼,因為請求javascript文件是沒有同源問題的。
2.當請求數(shù)據(jù)類型為jsonp時,會將callback=jsonpCallback加在url上,http://localhost:8090/api/testcallback=jsonpCallback
3.前臺javascript中定義jsonpCallback函數(shù),此函數(shù)必須定義在window下,也就是全局的函數(shù),否則找不到。
4.后臺獲取請求的callback參數(shù)值jsonpCallback,返回字符串"jsonpCallback(result)",result為返回結(jié)果。
5.請求返回的是script tag,首先會調(diào)用jsonpCallback函數(shù),不管是否找到該函數(shù),都會調(diào)用success函數(shù)。
6.如果沒有定義jsonp和jsonpCallback,jsonp默認為"callback",jsonpCallback會是Jquery自動生成的函數(shù)名。
angularJS中jsonp的使用
myUrl = "http://localhost:8090/api/test?callback=JSON_CALLBACK"; $http.jsonp(myUrl).success( function(data){ alert(data); } );
1.angularJS中使用$http.jsonp函數(shù)
2.指定callback和回調(diào)函數(shù)名,函數(shù)名為JSON_CALLBACK時,會調(diào)用success回調(diào)函數(shù),JSON_CALLBACK必須全為大寫。
3.也可以指定其它回調(diào)函數(shù),但必須是定義在window下的全局函數(shù)。
4.url中必須加上callback
5.當callback為JSON_CALLBACK時,只會調(diào)用success,即使window中有JSON_CALLBACK函數(shù),也不會調(diào)用該函數(shù)。
更多關(guān)于AngularJS相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《AngularJS指令操作技巧總結(jié)》、《AngularJS入門與進階教程》及《AngularJS MVC架構(gòu)總結(jié)》
希望本文所述對大家AngularJS程序設(shè)計有所幫助。
相關(guān)文章
Angular使用ng-messages與PHP進行表單數(shù)據(jù)驗證
這篇文章主要介紹了Angular使用ng-messages與PHP進行表單數(shù)據(jù)驗證,ng-messages提供了更方便的表單數(shù)據(jù)驗證服務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12Angular.js回顧ng-app和ng-model使用技巧
這篇文章主要回顧Angular.js中ng-app和ng-model使用技巧,感興趣的小伙伴們可以參考一下2016-04-04Angular angular-file-upload文件上傳的示例代碼
這篇文章主要介紹了Angular angular-file-upload文件上傳的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08Ubuntu系統(tǒng)下Angularjs開發(fā)環(huán)境安裝
本文主要介紹 Ubuntu系統(tǒng)下Angularjs開發(fā)環(huán)境安裝,這里詳細介紹了安裝步驟和注意事項,有在Ubuntu 環(huán)境下開發(fā)的朋友可以參考下2016-09-09Angular?服務(wù)器端渲染應(yīng)用常見的內(nèi)存泄漏問題小結(jié)
這篇文章主要介紹了Angular?服務(wù)器端渲染應(yīng)用一個常見的內(nèi)存泄漏問題,主要包括屏幕閃爍問題,出現(xiàn)閃爍的原因,在于 Angular 不知道如何重用它在服務(wù)器上成功渲染的內(nèi)容,本文給大家介紹的非常詳細,需要的朋友一起學(xué)習下吧2022-06-06關(guān)于AngularJs數(shù)據(jù)的本地存儲詳解
本文主要介紹了每一個獨立的JS文件或者不同的控制器如何實現(xiàn)數(shù)據(jù)的共享與交互的方法。具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01angular4應(yīng)用中輸入的最小值和最大值的方法
這篇文章主要介紹了angular4應(yīng)用中輸入的最小值和最大值的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05