校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 淺析JSONP之解決ajax跨域問題

淺析JSONP之解決ajax跨域問題

熱門標簽:上海浦東百度地圖標注中心注冊 徐州電銷卡外呼系統(tǒng)供應商 青海醫(yī)療智能外呼系統(tǒng)怎么樣 襄陽外呼系統(tǒng)接口 外呼系統(tǒng)獲取客戶手機號 科智聯(lián)智能電銷機器人 目標三維地圖標注 百靈鳥 老虎郵局地圖標注點

JSON和JSONP

  JSONP和JSON好像啊,他們之間有什么聯(lián)系嗎?

  JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。對于JSON大家應該是很了解了吧,不是很清楚的朋友可以去json.org上了解下,簡單易懂。

  JSONP是JSON with Padding的略稱。它是一個非官方的協(xié)議,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問(這僅僅是JSONP簡單的實現形式)。

  JSONP就像是JSON+Padding一樣(Padding這里我們理解為填充), 我們先看下面的小例子然后再詳細介紹。

同源策略

  為什么會出這樣的錯誤呢?這是因為所有支持Javascript的瀏覽器都會使用同源策略這個安全策略。看看百度的解釋:

  同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支持JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協(xié)議,端口相同。當一個瀏覽器的兩個tab頁中分別打開來 百度和谷歌的頁面當一個百度瀏覽器執(zhí)行一個腳本的時候會檢查這個腳本是屬于哪個頁面的,即檢查是否同源,只有和百度同源的腳本才會被執(zhí)行。

  這就是引起為何取不到數據的原因了,那如何才能解決跨域的問題呢?沒錯,我們現在可以進入正題,來了解下什么是JSONP了。

跨域的簡單原理

  光看定義還不是很明白,那首先我們先來手動做個簡單易懂的小測試。新建一個asp.net的web程序,添加sample.html網頁和一個test.js文件,代碼如下:

sample.html的代碼:

 !DOCTYPE html PUBLIC "-//WC//DTD XHTML . Transitional//EN" "http://www.w.org/TR/xhtml/DTD/xhtml-transitional.dtd">
 html xmlns="http://www.w.org//xhtml" >
 head>
   title>test/title>
   script type="text/javascript" src="test.js">/script>
 /head>
 body>
 /body>
 /html>

test.js的代碼:

alert("success");

  打開sample.html后會跳出"success”這樣的這樣的信息框,這似乎并不能說明什么, 跨域問題到底怎么解決呢?好,現在我們模擬下非同源的環(huán)境,剛才我們不是已經用Visual Studio新建了一個Web程序嗎(這里我們叫A程序),現在我們再打開一個新的Visual Studio再新建一個Web程序(B程序),將我們的之前的test.js文件從A程序中移除然后拷貝到B程序中。兩個程序都運行起來后,Visual Studio會啟動內置服務器,假設A程序是localhost:20001,B程序是localhost:20002,這就模擬了一個非同源的環(huán)境了(雖然域名相同但端口號不同,所以是非同源的)。

  OK,我們接下來應該改下sample.html里的代碼,因為test.js文件在B程序上了,url也就變成了localhost:20002。

sample.html部分代碼:

script type="text/javascript" src="http://localhost:20002/test.js">/script>

  請保持AB兩個Web程序的運行狀態(tài),當你再次刷新localhost:20001/sample.html的時候,和原來一樣跳出了"success"的對話框,是的,成功訪問到了非同源的localhost:20002/test.js這個所謂的遠程服務了。到了這一步,相信大家應該已經大概明白如何跨域訪問了的原理了。

  script>標簽的src屬性并不被同源策略所約束,所以可以獲取任何服務器上腳本并執(zhí)行。

JSONP的實現模式--CallBack

  剛才的小例子講解了跨域的原理,我們回上去再看看JSONP的定義說明中講到了javascript callback的形式。那我們就來修改下代碼,如何實現JSONP的javascript callback的形式。

程序A中sample的部分代碼:

 script type="text/javascript">
 //回調函數
 function callback(data) { 
   alert(data.message); 
 } 
 /script> 
 script type="text/javascript" src="http://localhost:20002/test.js">/script>

程序B中test.js的代碼:

//調用callback函數,并以json數據形式作為闡述傳遞,完成回調

callback({message:"success"}); 

  這其實就是JSONP的簡單實現模式,或者說是JSONP的原型:創(chuàng)建一個回調函數,然后在遠程服務上調用這個函數并且將JSON 數據形式作為參數傳遞,完成回調。

  將JSON數據填充進回調函數,這就是JSONP的JSON+Padding的含義吧。

  一般情況下,我們希望這個script標簽能夠動態(tài)的調用,而不是像上面因為固定在html里面所以沒等頁面顯示就執(zhí)行了,很不靈活。我們可以通過javascript動態(tài)的創(chuàng)建script標簽,這樣我們就可以靈活調用遠程服務了。

程序A中sample的部分代碼:

 script type="text/javascript"> 
   function callback(data) { 
     alert(data.message); 
   } 
   //添加script>標簽的方法 
   function addScriptTag(src){ 
   var script = document.createElement('script'); 
     script.setAttribute("type","text/javascript"); 
     script.src = src; 
     document.body.appendChild(script);
   } 
 
   window.onload = function(){ 
     addScriptTag("http://localhost:/test.js"); 
   } 
 /script>

  程序B的test.js代碼不變,我們再執(zhí)行下程序,是不是和原來的一樣呢。如果我們再想調用一個遠程服務的話,只要添加addScriptTag方法,傳入遠程服務的src值就可以了。這里說明下為什么要將addScriptTag方法放入到window.onload的方法里,原因是addScriptTag方法中有句document.body.appendChild(script);,這個script標簽是被添加到body里的,由于我們寫的javascript代碼是在head標簽中,document.body還沒有初始化完畢呢,所以我們要通過window.onload方法先初始化頁面,這樣才不會出錯。

  上面的例子是最簡單的JSONP的實現模型,不過它還算不上一個真正的JSONP服務。我們來看一下真正的JSONP服務是怎么樣的,比如Google的ajax搜索接口:http://ajax.googleapis.com/ajax/services/search/web?v=1.0q=?callback=?

  q=?這個問號是表示你要搜索的內容,最重要的是第二個callback=?這個是正如其名表示回調函數的名稱,也就是將你自己在客戶端定義的回調函數的函數名傳送給服務端,服務端則會返回以你定義的回調函數名的方法,將獲取的json數據傳入這個方法完成回調。有點羅嗦了,還是看看實現代碼吧:

 script type="text/javascript"> 
   //添加script>標簽的方法 
   function addScriptTag(src){
     var script = document.createElement('script');
     script.setAttribute("type","text/javascript");
     script.src = src;
     document.body.appendChild(script);
   }
   window.onload = function(){
     //搜索apple,將自定義的回調函數名result傳入callback參數中
     addScriptTag("http://ajax.googleapis.com/ajax/services/search/web?v=.q=applecallback=result");
   }
   //自定義的回調函數result
   function result(data) {
     //我們就簡單的獲取apple搜索結果的第一條記錄中url數據
     alert(data.responseData.results[].unescapedUrl);
   }
 /script>

像這樣的JSONP服務還有很多(以下信息來自使用 JSONP 實現跨域通信,第 1 部分: 結合 JSONP 和 jQuery 快速構建強大的 mashup):

Digg API:來自 Digg 的頭條新聞:

  http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.comtype=javascriptcallback=?

Geonames API:郵編的位置信息:

  http://www.geonames.org/postalCodeLookupJSON?postalcode=10504country=UScallback=?

Flickr JSONP API:載入最新貓的圖片:

  http://api.flickr.com/services/feeds/photos_public.gne?tags=cattagmode=anyformat=jsonjsoncallback=?

Yahoo Local Search API:在郵編為 10504 的地區(qū)搜索比薩:

  http://local.yahooapis.com/LocalSearchService/V3/localSearch?appid=YahooDemoquery=pizzazip=10504results=2output=jsoncallback=?

  接下來我們自己來創(chuàng)建一個簡單的遠程服務,實現和上面一樣的JSONP服務。還是利用Web程序A和程序B來做演示,這次我們在程序B上創(chuàng)建一個MyService.ashx文件。

程序B的MyService.ashx代碼:

 public class MyService : IHttpHandler 
   { 
     public void ProcessRequest(HttpContext context) 
     { 
       //獲取回調函數名 
       string callback = context.Request.QueryString["callback"]; 
       //json數據 
       string json = "{\"name\":\"chopper\",\"sex\":\"man\"}"; 
 
       context.Response.ContentType = "application/json"; 
       //輸出:回調函數名(json數據)
       context.Response.Write(callback + "(" + json + ")");
     } 
 
     public bool IsReusable 
     { 
       get 
       { 
         return false; 
       } 
     } 
   }

程序A的sample代碼中的調用:

 script type="text/javascript">   function addScriptTag(src){
     var script = document.createElement('script');
     script.setAttribute("type","text/javascript");
     script.src = src;
     document.body.appendChild(script);
   }
    window.onload = function(){
     //調用遠程服務     addScriptTag("http://localhost:/MyService.ashx?callback=person");
   }
   //回調函數person   function person(data) {
     alert(data.name + " is a " + data.sex);
   }
 /script>  

  這就完成了一個最基本的JSONP服務調用了,是不是很簡單,下面我們來了解下JQuery是如何調用JSONP的。

jQuery對JSONP的實現

  jQuery框架也當然支持JSONP,可以使用$.getJSON(url,[data],[callback])方法(詳細可以參考http://api.jquery.com/jQuery.getJSON/)。那我們就來修改下程序A的代碼,改用jQuery的getJSON方法來實現(下面的例子沒用用到向服務傳參,所以只寫了getJSON(url,[callback])):

script type="text/javascript" src="http://code.jquery.com/jquery-latest.js">/script> script type="text/javascript">  
 $.getJSON("http://localhost:20002/MyService.ashx?callback=?",
function(data){     alert(data.name + " is a a" + data.sex);   }); 
/script>

  結果是一樣的,要注意的是在url的后面必須添加一個callback參數,這樣getJSON方法才會知道是用JSONP方式去訪問服務,callback后面的那個問號是內部自動生成的一個回調函數名。這個函數名大家可以debug一下看看,比如jQuery17207481773362960666_1332575486681。

  當然,加入說我們想指定自己的回調函數名,或者說服務上規(guī)定了固定回調函數名該怎么辦呢?我們可以使用$.ajax方法來實現(參數較多,詳細可以參考http://api.jquery.com/jQuery.ajax)。先來看看如何實現吧:

script type="text/javascript" src="http://code.jquery.com/jquery-latest.js">/script> 
script type="text/javascript">  
 $.ajax({     url:"http://localhost:20002/MyService.ashx?callback=?",      
dataType:"jsonp",     jsonpCallback:"person",     
success:function(data){       
alert(data.name + " is a a" + data.sex);     }  }); 
/script>

  沒錯,jsonpCallback就是可以指定我們自己的回調方法名person,遠程服務接受callback參數的值就不再是自動生成的回調名,而是person。dataType是指定按照JSOPN方式訪問遠程服務。

利用jQuery可以很方便的實現JSONP來進行跨域訪問。先暫時寫到這吧。后續(xù)還有更新,請持續(xù)關注,謝謝。

您可能感興趣的文章:
  • AJAX的跨域與JSONP(為文章自動添加短址的功能)
  • 跨域請求之jQuery的ajax jsonp的使用解惑
  • jquery ajax jsonp跨域調用實例代碼
  • JSONP跨域GET請求解決Ajax跨域訪問問題
  • AJAX跨域請求之JSONP獲取JSON數據
  • Ajax jsonp跨域請求實現方法
  • AJax與Jsonp跨域訪問問題小結
  • AJAX實現跨域的三種方法(代理,JSONP,XHR2)
  • 原生JS封裝Ajax插件(同域、jsonp跨域)
  • 深入淺析Jsonp解決ajax跨域問題

標簽:辛集 揭陽 股票 紅河 商洛 咸寧 荊州 佛山

巨人網絡通訊聲明:本文標題《淺析JSONP之解決ajax跨域問題》,本文關鍵詞  淺析,JSONP,之,解決,ajax,跨域,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析JSONP之解決ajax跨域問題》相關的同類信息!
  • 本頁收集關于淺析JSONP之解決ajax跨域問題的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲影院免费观看| 国产电影精品久久禁18| 免费欧美日韩国产三级电影| 国产一区二区三区| 欧美亚洲一区二区在线| 精品免费99久久| 午夜精品久久久久久| 国产a视频精品免费观看| 欧美日韩国产精选| ●精品国产综合乱码久久久久| 蜜臀av在线播放一区二区三区| 色悠悠亚洲一区二区| 国产欧美综合在线观看第十页| 三级一区在线视频先锋| 97久久超碰国产精品| 国产日韩欧美亚洲| 捆绑紧缚一区二区三区视频| 在线观看一区二区视频| 国产精品色呦呦| 国产成人精品影视| 国产婷婷色一区二区三区四区| 男人的j进女人的j一区| 在线免费av一区| 夜夜爽夜夜爽精品视频| 色94色欧美sute亚洲13| 久久精品视频免费| 国产河南妇女毛片精品久久久| 欧美一区二区成人6969| 亚洲观看高清完整版在线观看| 99re这里都是精品| 成人欧美一区二区三区白人| 国产成人亚洲精品青草天美| 久久综合狠狠综合久久激情| 另类小说图片综合网| 欧美一区二区精品在线| 青青草原综合久久大伊人精品| 在线观看91av| 日本人妖一区二区| 亚洲精品在线三区| 国产精品一卡二卡| 国产清纯白嫩初高生在线观看91 | 蜜桃一区二区三区四区| 欧美在线视频全部完| 亚洲一本大道在线| 69堂国产成人免费视频| 精彩视频一区二区三区| 国产亚洲精品免费| 91视频观看视频| 亚洲国产日韩精品| 欧美成人精品3d动漫h| 久久精品国产久精国产爱| 欧美mv日韩mv| 丁香五精品蜜臀久久久久99网站| 欧美国产日本视频| 91黄色激情网站| 免费视频最近日韩| 国产精品天天看| 91精彩视频在线| 激情久久五月天| 中文字幕一区二区不卡| 欧美日韩久久一区二区| 韩国女主播一区| 最新不卡av在线| 日韩一区二区三免费高清| 国产高清精品网站| 亚洲电影中文字幕在线观看| 精品少妇一区二区三区在线播放| 成人久久视频在线观看| 一区二区在线观看视频| 日韩欧美国产精品一区| voyeur盗摄精品| 琪琪久久久久日韩精品| 国产精品久久久久久久久免费相片 | 激情欧美一区二区三区在线观看| 国产精品午夜电影| 欧美人与性动xxxx| 成人一区二区三区| 日韩激情一区二区| 亚洲欧美国产高清| 久久毛片高清国产| 欧美精品精品一区| www.欧美日韩国产在线| 日韩精品亚洲一区二区三区免费| 国产亚洲欧美日韩日本| 欧美日韩一卡二卡三卡 | 国产精品人成在线观看免费| 欧美老肥妇做.爰bbww| 成人av电影在线观看| 免费美女久久99| 五月天国产精品| 中文字幕佐山爱一区二区免费| 欧美xxxx在线观看| 欧美日韩dvd在线观看| 97久久精品人人做人人爽| 国产一区三区三区| 日韩激情一二三区| 五月天视频一区| 亚洲风情在线资源站| 亚洲激情网站免费观看| 国产精品天干天干在线综合| 精品国产99国产精品| 欧美一区二区福利在线| 欧美日韩国产天堂| 欧美日韩一区二区在线视频| 91在线观看一区二区| 国产精品一区二区男女羞羞无遮挡| 日韩精品视频网站| 日韩高清在线电影| 天堂久久一区二区三区| 亚洲电影欧美电影有声小说| 一区二区三区精品视频在线| 国产精品国产a| 国产精品欧美极品| 国产精品丝袜黑色高跟| 国产欧美一区二区精品性色超碰| 精品国产乱码久久久久久夜甘婷婷| 欧美日韩在线观看一区二区 | 91精品国产综合久久久蜜臀粉嫩 | 亚洲国产综合在线| 亚洲国产cao| 热久久久久久久| 久久精品国产久精国产| 久久99国产精品成人| 国产专区综合网| 国产成人亚洲综合色影视| 国产传媒日韩欧美成人| 成人激情免费视频| 91麻豆成人久久精品二区三区| 91蝌蚪porny| 欧美色手机在线观看| 欧美肥大bbwbbw高潮| 91精品国产麻豆国产自产在线 | 8x8x8国产精品| 精品国产亚洲一区二区三区在线观看| 精品日韩欧美在线| 中文字幕巨乱亚洲| 一级中文字幕一区二区| 免费成人在线播放| 成人不卡免费av| 欧美视频一区二区在线观看| 91麻豆精品国产无毒不卡在线观看 | 在线观看视频91| 欧美va亚洲va香蕉在线 | 久久综合狠狠综合久久激情| 国产亚洲一区二区三区在线观看| 日本一区免费视频| 午夜欧美2019年伦理| 国产在线一区二区| 欧洲国产伦久久久久久久| 欧美日韩成人高清| 国产亚洲欧洲997久久综合| 亚洲欧洲制服丝袜| 蜜臀a∨国产成人精品| 成人晚上爱看视频| 欧美一级一区二区| 日韩美女视频19| 免费不卡在线视频| 日本乱人伦aⅴ精品| 精品国产露脸精彩对白 | 国产精品99久久久久久宅男| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 欧美视频一区二区三区四区| 精品蜜桃在线看| 亚洲成人免费观看| 成人午夜视频福利| 日韩欧美中文字幕公布| 亚洲人精品午夜| 国产又粗又猛又爽又黄91精品| 欧美三级资源在线| 国产精品女主播在线观看| 麻豆91在线看| 欧美日韩国产美女| 亚洲另类春色校园小说| 国产成人亚洲精品青草天美| 91精品在线免费| 亚洲最大成人综合| 99视频国产精品| 国产午夜亚洲精品理论片色戒| 日韩福利电影在线观看| 91激情五月电影| 最新不卡av在线| 成人综合在线观看| 国产色婷婷亚洲99精品小说| 美国十次了思思久久精品导航| 欧美自拍丝袜亚洲| 一区二区在线观看视频在线观看| 成人午夜激情视频| 欧美国产视频在线| 国产夫妻精品视频| 国产日韩欧美精品一区| 蜜臀久久久久久久| 欧美军同video69gay| 亚洲一区二区三区四区五区黄| 99视频超级精品| 中文字幕一区二区视频| 成人性生交大合| 亚洲天堂久久久久久久| 91丨porny丨户外露出| 国产精品福利一区| 92国产精品观看|