主頁(yè) > 知識(shí)庫(kù) > Ajax jsonp跨域請(qǐng)求實(shí)現(xiàn)方法

Ajax jsonp跨域請(qǐng)求實(shí)現(xiàn)方法

熱門標(biāo)簽:硅語(yǔ)電話機(jī)器人公司 超級(jí)大富翁地圖標(biāo)注 地圖標(biāo)注項(xiàng)目怎么樣 機(jī)器人電銷騙局揭秘 ai機(jī)器人電銷資源 個(gè)人怎樣在百度地圖標(biāo)注地名 越南河內(nèi)地圖標(biāo)注 云呼外撥網(wǎng)絡(luò)電話系統(tǒng) 騰訊地圖標(biāo)注位置能用多久

什么是跨域?

簡(jiǎn)單的來(lái)說(shuō),出于安全方面的考慮,頁(yè)面中的JavaScript無(wú)法訪問(wèn)其他服務(wù)器上的數(shù)據(jù),即“同源策略”。而跨域就是通過(guò)某些手段來(lái)繞過(guò)同源策略限制,實(shí)現(xiàn)不同服務(wù)器之間通信的效果。

具體策略限制情況可看下表:

 

URL 說(shuō)明 允許通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允許
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夾 允許
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 不允許
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同協(xié)議 不允許
http://www.a.com/a.js
http://127.0.0.100/b.js
域名和域名對(duì)應(yīng)ip 不允許
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 不允許
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二級(jí)域名(同上) 不允許
http://www.a.com/a.js
http://www.b.com/b.js
不同域名 不允許

什么是JSONP?

JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,而JSONP(JSON with Padding)則是JSON 的一種“使用模式”,通過(guò)這種模式可以實(shí)現(xiàn)數(shù)據(jù)的跨域獲取。

JSONP跨域的原理

在同源策略下,在某個(gè)服務(wù)器下的頁(yè)面是無(wú)法獲取到該服務(wù)器以外的數(shù)據(jù)的,但img、iframe、script等標(biāo)簽是個(gè)例外,這些標(biāo)簽可以通過(guò)src屬性請(qǐng)求到其他服務(wù)器上的數(shù)據(jù)。利用script標(biāo)簽的開(kāi)放策略,我們可以實(shí)現(xiàn)跨域請(qǐng)求數(shù)據(jù),當(dāng)然,也需要服務(wù)端的配合。當(dāng)我們正常地請(qǐng)求一個(gè)JSON數(shù)據(jù)的時(shí)候,服務(wù)端返回的是一串JSON類型的數(shù)據(jù),而我們使用JSONP模式來(lái)請(qǐng)求數(shù)據(jù)的時(shí)候,服務(wù)端返回的是一段可執(zhí)行的JavaScript代碼。

跨域: js有一個(gè)同源限制,簡(jiǎn)單說(shuō)來(lái)源不一樣的話就無(wú)法相互間交互.那么怎么算來(lái)源不一樣呢, 舉個(gè)例子:瀏覽器訪問(wèn)-->服務(wù)器A--->得到頁(yè)面A---頁(yè)面A中的js腳本只能訪問(wèn)服務(wù)器A的資源(相同域名和端口,此外域名與對(duì)應(yīng)的ip也算不同源,要么都域名,要么都ip).

以上就是js的跨域問(wèn)題,但是這里需要注意一點(diǎn)的是服務(wù)器A是沒(méi)有跨域的問(wèn)題的,這個(gè)只有js存在這個(gè)問(wèn)題,也就是說(shuō): 頁(yè)面A中js-->服務(wù)器A--->跨域資源,這個(gè)路徑是可以.只有 頁(yè)面A中的js--->跨域資源,這個(gè)路徑是不行的.

然后說(shuō)一下解決方案中的jsonp,這個(gè)不是一種格式,而是一種解決方案.

jsonp的原理:js雖然有同源限制,但是引入js文件的時(shí)候卻沒(méi)有這個(gè)限制,也就是說(shuō):

script type="text/javascript" src="xxx/xxxx.js">/script>

其中src屬性引入js文件的時(shí)候是沒(méi)有同源限制的,此時(shí)是可以引入域外資源的.jsonp的原理就在這里,通過(guò)動(dòng)態(tài)的創(chuàng)建一個(gè)以上那行js引入語(yǔ)句,通過(guò)其src屬性訪問(wèn)域外資源.而域外資源服務(wù)器只要返回一個(gè)能被解析為js語(yǔ)句的字符串即可達(dá)到返回結(jié)果的目的,形如:

callback({"key":"value",...}) 

其中callback是需要事先約定的名字,綠字部分為要返回到j(luò)son字符串,然后拼接成以上那種形式直接返回即可.這樣頁(yè)面中的js從服務(wù)端接收到這個(gè)拼接的字符串后,就會(huì)直接執(zhí)行本地的名為callback的js方法,這也就是為何callback這個(gè)需要事先約定的原因,需要保證頁(yè)面?zhèn)纫嬖谶@個(gè)js方法,這個(gè)方法傳入的參數(shù)就為服務(wù)器側(cè)的返回值.

ajax是支持jsonp的,所以以上那些麻煩事情都會(huì)替我們做,寫(xiě)法如下:

$.ajax({
     type: 'GET',
     url: "http://127.0.0.1:8080/xxx/xxx",
     async: false,
     dataType: "jsonp",
     jsonp: "callback",
     success: function(result){
       .....
     },
     timeout:3000 
  });

紅字部分標(biāo)識(shí)我們使用jsonp的方式調(diào)用,實(shí)際上此時(shí)這個(gè)已經(jīng)不是傳統(tǒng)意義上的ajax的get請(qǐng)求了,它的真實(shí)實(shí)現(xiàn)方式就是我們上文中說(shuō)的那樣.其中紅字部分的callback為我們要和服務(wù)器端進(jìn)行溝通的部分,這個(gè)請(qǐng)求發(fā)送到服務(wù)器端,實(shí)際上這樣的:

http://127.0.0.1:8080/xxx/xxx?callback=jqueryxxxx

服務(wù)器端需要通過(guò)callback來(lái)取值(類似用request.getParameter("callback")),也就是取后面的jqueryxxxx等自動(dòng)生成的值,這個(gè)值實(shí)際上就是對(duì)應(yīng)的我們發(fā)送請(qǐng)求的ajax方法中的success回調(diào)方法,服務(wù)器端如果返回

jqueryxxxx({"ret":"ok"})

頁(yè)面中會(huì)自動(dòng)執(zhí)行success方法,且將{"ret":"ok"}傳給success方法的參數(shù)result.

以上就是ajax通過(guò)jsonp的方式實(shí)現(xiàn)跨域訪問(wèn)的過(guò)程.可以看出基本不用我們做什么額外操作,全都封裝好了.

ps:在jQuery中如何通過(guò)JSONP來(lái)跨域獲取數(shù)據(jù)

第一種方法是在ajax函數(shù)中設(shè)置dataType為'jsonp': 

$.ajax({
    dataType: 'jsonp',
    url: 'http://www.a.com/user?id=123',
    success: function(data){
        //處理data數(shù)據(jù)
    }
});

第二種方法是利用getJSON來(lái)實(shí)現(xiàn),只要在地址中加上callback=?參數(shù)即可: 

$.getJSON('http://www.a.com/user?id=123callback=?', function(data){
    //處理data數(shù)據(jù)
});

也可以簡(jiǎn)單地使用getScript方法:

//此時(shí)也可以在函數(shù)外定義foo方法
function foo(data){
    //處理data數(shù)據(jù)
}
$.getJSON('http://www.a.com/user?id=123callback=foo');

JSONP的應(yīng)用

JSONP在開(kāi)放API中可以起到非常重要的作用,開(kāi)放API是運(yùn)用在開(kāi)發(fā)者自己的應(yīng)用上,而許多應(yīng)用往往是在開(kāi)發(fā)者的服務(wù)器上而不是在新浪微博的服務(wù)器上,因此跨域請(qǐng)求數(shù)據(jù)成為開(kāi)發(fā)者們所需要解決的一大問(wèn)題,廣大開(kāi)放平臺(tái)應(yīng)該實(shí)現(xiàn)對(duì)JSONP的支持,這一點(diǎn)新浪微博開(kāi)放平臺(tái)便做的非常好(雖然某些API里沒(méi)有說(shuō)明,但實(shí)際上是可以使用JSONP方式調(diào)用的)。

您可能感興趣的文章:
  • 實(shí)例講解使用原生JavaScript處理AJAX請(qǐng)求的方法
  • 原生js jquery ajax請(qǐng)求以及jsonp的調(diào)用方法
  • 詳解JavaScript原生封裝ajax請(qǐng)求和Jquery中的ajax請(qǐng)求
  • 原生javascript的ajax請(qǐng)求及后臺(tái)PHP響應(yīng)操作示例
  • Javascript原生ajax請(qǐng)求代碼實(shí)例
  • 輕松搞定jQuery+JSONP跨域請(qǐng)求的解決方案
  • JavaScript用JSONP跨域請(qǐng)求數(shù)據(jù)實(shí)例詳解
  • JSONP跨域請(qǐng)求實(shí)例詳解
  • 詳細(xì)解密jsonp跨域請(qǐng)求
  • JSONP跨域請(qǐng)求
  • jsonp跨域請(qǐng)求實(shí)現(xiàn)示例
  • 原生js實(shí)現(xiàn)ajax請(qǐng)求和JSONP跨域請(qǐng)求操作示例

標(biāo)簽:內(nèi)蒙古 遼源 舟山 海南 洛陽(yáng) 鄭州 林芝 邢臺(tái)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Ajax jsonp跨域請(qǐng)求實(shí)現(xiàn)方法》,本文關(guān)鍵詞  Ajax,jsonp,跨域,請(qǐng)求,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Ajax jsonp跨域請(qǐng)求實(shí)現(xiàn)方法》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Ajax jsonp跨域請(qǐng)求實(shí)現(xiàn)方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章