關於跨域問題的解決方案多達7、八種,你不要說哪有這麼多,我不跟你較真哈,你也別跟我較真哈, ?!自行百度
或JSONP
, 你要非說JSONP
用的不是最多的, 我不信哦, 你信好了, 哈哈, 你開心就好?
要了解什麼是
跨域
你須要瞭解什麼是瀏覽器的
同源策略
其實說白了就一句話
相同域名、相同協議、相同端口
瀏覽器才容許訪問, 這是出於安全方面的考慮, 其它一概不容許訪問!
好比說:a.com/article/mid/512
要訪問a.com/data/detail/512
是容許訪問的,a.com/article/mid/512
要訪問b.com/data/detail/512
是拒絕的!
那麼非要訪問不一樣域名下的資源, 怎麼辦呢?那麼問題來了!跨域
這種方式是在沒有跨域訪問其它域名資源URL常規作法!而訪問其它域名資源URL是不可行的!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JSONP TEST</title> <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> </head> <body> <script> $.ajax({ type : 'GET', dataType : 'JSON', url : "http://warnerwu.centos.dev/?c=adCreativeLib&a=api&type=list", success : function (data){ console.log(data); } }); </script> </body> </html>
能夠發現控制檯並無輸出任何返回數據, 由於它也沒有數據可輸出, 而是給出了下面這樣一個提示信息:
而在網絡請求列表能夠看到請求資源URL沒有返回任何數據
既然經過jQuery
的AJAX
方法返回數據形式是JSON
格式, 請求資源URL, 沒有獲取到任何數據, 經過瀏覽器直接訪問資源URL能夠正常獲取到數據!
從上面能夠看到經過瀏覽器直接訪問資源URL也就是API接口是能夠獲取到數據的, 而經過返回數據形式爲JSON
的方式是拒絕訪問的, 那麼要想經過在tem.mac.dev
這個域名訪問warnerwu.centos.dev
域名下的API接口URL資源就須要使用JSONP
, 只須要將jQuery
中AJAX
方法中的dataType
值修改成便可
dataType : 'JSONP'
注意javascript
這裏也只是限於把上面所說的「直接經過瀏覽器訪問資源API接口URL獲取到的數據」經過JSONP的形式給獲取到了而已也只是僅僅如此, 下面再次刷新頁面經過
JSONP
訪問資源API接口URL來驗證這一點!
在控制檯下已經看不到已攔截跨域請求
的警告信息啦!而是空空如也
哦 ?
那既然在控制檯
看不到任何警告
信息也看不到數據輸出, 不防看一下網絡
請求列表是怎麼樣的!
從
網絡
請求列表中的最後一條能夠看出這個訪問資源API接口的完整URL是:
http://warnerwu.centos.dev/?c=adCreativeLib&a=api&type=list&callback=jQuery21408945840059161158_1519958486174&_=1519958486175
這裏你就會發現這個請求資源地址與AJAX
方法中的url
參數值大相徑庭! 它多了兩個參數:
callback=jQuery21408945840059161158_1519958486174&_=1519958486175
是這樣的, 在使用jQuery
的AJAX
方法時, 若是指定返回數據方式是JSONP
時, 也就是AJAX
參數對象字面量dataType : 'JSONP'
時, 以下所示:
$.ajax({ type : 'GET', dataType : 'JSONP', url : "http://warnerwu.centos.dev/?c=adCreativeLib&a=api&type=list", success : function (data){ console.log(data); } });
它就會在發起請求資源時在AJAX
方法參數對象字面量url
的具體連接上自動添加參數callback
和_
, 並且這兩個參數的值基本上永遠不會重複
url
JSONP參數值jQuery
開頭後跟隨機數字字符串的回調函數名稱AJAX
請求都是新的, 而不會使用瀏覽器已請求過的URL 緩存機制
已存在資源在上圖中能夠看到網絡
請求資源列表中API接口訪問URL的具體參數列表, 而響應
具體是這樣的:
能夠看到響應
返回的是JSON格式的數據, 這樣是不對的!不防再看一下控制檯
:
能夠看到控制檯依然是空空如也
!什麼都沒有, 到目錄爲止其實前端或客戶端
所作的工做已經完成!接下來就是服務器端
API接口要作些修改操做嘍!
這裏使用的服務器端語言是 PHP
, 其它語言也是同樣處理哦!html
其實服務器端因此要的調整很簡單, 只須要獲取請求參數callback
, 而後返回以callback
參數值爲函數名稱的JSONP格式的編碼數據字符串便可
這種處理方式是針對不存在跨域API接口請求獲取數據時一般的作法, 若是是JSONP跨域請求API接口獲取數據時就不通用嘍!
能夠看到這裏在服務器端處理爲通用請求獲取數據返回形式, 不論是否是跨域請求API接口都可使用!
你會發現請求API接口數據成功, 而且請求時的callback
參數值和返回的JSONP格式數據方法名稱一致, 獲取到的JSONP格式數據怎麼處理的呢?當請求成功時就會執行以
jQuery
下AJAX
方法生成的callback
參數值對就的函數, 剛好這個正是從服務器端返回的JSONP格式數據, 函數執行結束後返回主題數據也就是與服務器端編碼返回以前的數據類型一致的數據形式前端
以上是跨域請求API接口經過控制檯輸出的數組數據
以上是經過瀏覽器直接訪問API接口獲取的數組數據
說白了使用JQuery
的AJAX
方法實現跨域請求資源是很是簡單的!
$.ajax({ type : 'GET', dataType : 'JSONP', url : "http://warnerwu.centos.dev/?c=adCreativeLib&a=api&type=list", success : function (data){ console.log(data); } });
其實很是簡單的問題在這裏說了這麼多, 你們見諒!?以上就是
JSONP跨域訪問API接口深刻理解
的詳細過程, 謝謝您的支持!java但願本文對你的工做和學習有所幫助jquery
若是以爲還不錯而且也長知識了, 怎麼感謝我呢? 媽呀! 點贊啊!ajax
Good Luck! from warnerwu at 2018.03.02 PM, email address is warnerwu@126.com後端