ajax跨域請(qǐng)求

JSNOP是一個(gè)非官方的協(xié)議乞旦,它允許在服務(wù)器端集成script tags返回至客戶端哲思,通過JavaScript callback的形式實(shí)現(xiàn)跨域訪問卦溢。

由于同源策略的限制民逼,XMLHttpRequest只允許請(qǐng)求當(dāng)前源(域名泵殴、協(xié)議、端口)的資源拼苍,為了實(shí)現(xiàn)跨域請(qǐng)求笑诅,可以通過script標(biāo)簽實(shí)現(xiàn)跨域請(qǐng)求,然后在服務(wù)端輸出json數(shù)據(jù)并執(zhí)行回調(diào)函數(shù)疮鲫,從而解決了跨域的數(shù)據(jù)請(qǐng)求吆你。

使用jsonp:

a.第一種方法

<meta??? content="text/html;chartset=utf-8"???? http-equiv="Content-Type">

<script>

function jsonpCallback(result) {

//alert(result);

for(var?i?in?result)?{

alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc.

}

}

var???? JSONP=document.createElement("script");

JSONP.type="text/javascript";

JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback";

document.getElementsByTagName("head")[0].appendChild(JSONP);

</script>

b.第二種方法

<meta? ? content="text/html;chartset=utf-8"? ? http-equiv="Content-Type">

<script? type="text/javascript">

function jsonpCallback(result) {

alert(result.a);

alert(result.b);

alert(result.c);

for(var?i?in?result)?{

alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc.

}

}

</script>

<script???? type="text/javascript"????? src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>

JavaScript的鏈接,必須在function的下面棚点。

服務(wù)端PHP代碼 (services.php):

<?php

//服務(wù)端返回JSON數(shù)據(jù)

$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

$result=json_encode($arr);

//echo ? $_GET['callback'].'("Hello,World!")';

//echo?? $_GET['callback']."($result)";

//動(dòng)態(tài)執(zhí)行回調(diào)函數(shù)

$callback=$_GET['callback'];

echo??? $callback."($result)";

如果將上述JS客戶端代碼用jQuery的方法來實(shí)現(xiàn),也非常簡(jiǎn)單湾蔓。

$.getJSON

$.ajax

$.get

客戶端JS代碼在jQuery中的實(shí)現(xiàn)方式1:

<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript">

$.getJSON("http://crossdomain.com/services.php?callback=?",

function(result)?{

for?? (var?? i?? in???? result)?{

alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc.

}

});

</script>

客戶端JS代碼在jQuery中的實(shí)現(xiàn)方式2:

<script type="text/javascript"? src="jquery.js"></script>

<script type="text/javascript">

$.ajax({

url:"http://crossdomain.com/services.php",

dataType:'jsonp',

data:'',

jsonp:'callback',

success:function(result)?{

for(variinresult)?{

alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc.

}

},

timeout:3000

});

</script>

客戶端JS代碼在jQuery中的實(shí)現(xiàn)方式3:

<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript">

$.get('http://crossdomain.com/services.php?callback=?', {name: encodeURIComponent('tester')},function(json) {for(variinjson) alert(i+":"+json[i]); },'jsonp');

</script>

其中 jsonCallback 是客戶端注冊(cè)的瘫析,獲取跨域服務(wù)器上的json數(shù)據(jù)后,回調(diào)的函數(shù)默责。

http://crossdomain.com/services.php?callback=jsonpCallback

這個(gè) url 是跨域服務(wù)器取 json 數(shù)據(jù)的接口贬循,參數(shù)為回調(diào)函數(shù)的名字,返回的格式為Js代碼:
jsonpCallback({msg:'this?is?json?data'})

Jsonp原理:

首先在客戶端注冊(cè)一個(gè)callback, 然后把callback的名字傳給服務(wù)器桃序。

此時(shí)杖虾,服務(wù)器先生成 json 數(shù)據(jù)。

然后以 javascript 語法的方式媒熊,生成一個(gè)function , function 名字就是傳遞上來的參數(shù) jsonp.

最后將 json 數(shù)據(jù)直接以入?yún)⒌姆绞狡媸剩胖玫?function 中,這樣就生成了一段 js 語法的文檔芦鳍,返回給客戶端嚷往。

客戶端瀏覽器,解析script標(biāo)簽柠衅,并執(zhí)行返回的 javascript 文檔皮仁,此時(shí)數(shù)據(jù)作為參數(shù),傳入到了客戶端預(yù)先定義好的 callback 函數(shù)里.(動(dòng)態(tài)執(zhí)行回調(diào)函數(shù))

使用JSON的優(yōu)點(diǎn)在于:

比XML輕了很多菲宴,沒有那么多冗余的東西贷祈。

JSON也是具有很好的可讀性的,但是通常返回的都是壓縮過后的喝峦。不像XML這樣的瀏覽器可以直接顯示势誊,瀏覽器對(duì)于JSON的格式化的顯示就需要借助一些插件了。

在JavaScript中處理JSON很簡(jiǎn)單谣蠢。

其他語言例如PHP對(duì)于JSON的支持也不錯(cuò)键科。

JSON也有一些劣勢(shì):

JSON在服務(wù)端語言的支持不像XML那么廣泛闻丑,不過JSON.org上提供很多語言的庫。

如果你使用eval()來解析的話勋颖,會(huì)容易出現(xiàn)安全問題嗦嗡。

盡管如此,JSON的優(yōu)點(diǎn)還是很明顯的饭玲。他是Ajax數(shù)據(jù)交互的很理想的數(shù)據(jù)格式侥祭。

JSONP 是構(gòu)建 mashup

的強(qiáng)大技術(shù),但不幸的是茄厘,它并不是所有跨域通信需求的萬靈藥矮冬。它有一些缺陷,在提交開發(fā)資源之前必須認(rèn)真考慮它們次哈。

第一胎署,也是最重要的一點(diǎn),沒有關(guān)于

JSONP 調(diào)用的錯(cuò)誤處理窑滞。如果動(dòng)態(tài)腳本插入有效琼牧,就執(zhí)行調(diào)用;如果無效哀卫,就靜默失敗巨坊。失敗是沒有任何提示的。例如此改,不能從服務(wù)器捕捉到 404

錯(cuò)誤趾撵,也不能取消或重新開始請(qǐng)求。不過共啃,等待一段時(shí)間還沒有響應(yīng)的話占调,就不用理它了。(未來的 jQuery 版本可能有終止 JSONP

請(qǐng)求的特性)移剪。

JSONP 的另一個(gè)主要缺陷是被不信任的服務(wù)使用時(shí)會(huì)很危險(xiǎn)妈候。因?yàn)?JSONP 服務(wù)返回打包在函數(shù)調(diào)用中的 JSON

響應(yīng),而函數(shù)調(diào)用是由瀏覽器執(zhí)行的挂滓,這使宿主 Web 應(yīng)用程序更容易受到各類攻擊苦银。如果打算使用 JSONP 服務(wù),了解它能造成的威脅非常重要赶站。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幔虏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贝椿,更是在濱河造成了極大的恐慌想括,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烙博,死亡現(xiàn)場(chǎng)離奇詭異瑟蜈,居然都是意外死亡烟逊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門铺根,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪躯,“玉大人,你說我怎么就攤上這事位迂》醚” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵掂林,是天一觀的道長(zhǎng)臣缀。 經(jīng)常有香客問我,道長(zhǎng)泻帮,這世上最難降的妖魔是什么精置? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锣杂,結(jié)果婚禮上脂倦,老公的妹妹穿的比我還像新娘。我一直安慰自己蹲堂,他們只是感情好狼讨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布贝淤。 她就那樣靜靜地躺著柒竞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪播聪。 梳的紋絲不亂的頭發(fā)上朽基,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音离陶,去河邊找鬼稼虎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛招刨,可吹牛的內(nèi)容都是我干的霎俩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼沉眶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼打却!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谎倔,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤柳击,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后片习,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌肴,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹬叭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了状知。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽五。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖试幽,靈堂內(nèi)的尸體忽然破棺而出筝蚕,到底是詐尸還是另有隱情,我是刑警寧澤铺坞,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布起宽,位于F島的核電站,受9級(jí)特大地震影響济榨,放射性物質(zhì)發(fā)生泄漏坯沪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一擒滑、第九天 我趴在偏房一處隱蔽的房頂上張望腐晾。 院中可真熱鬧,春花似錦丐一、人聲如沸藻糖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巨柒。三九已至,卻和暖如春柠衍,著一層夾襖步出監(jiān)牢的瞬間洋满,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工珍坊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牺勾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓阵漏,卻偏偏與公主長(zhǎng)得像驻民,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子履怯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容