1、ajax和jsonp這兩種技術(shù)在調(diào)用方式上“看起來(lái)”很像,目的也一樣,都是請(qǐng)求一個(gè)url,然后把服務(wù)器返回的數(shù)據(jù)進(jìn)行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進(jìn)行了封裝;
2、但ajax和jsonp其實(shí)本質(zhì)上是不同的東西。ajax的核心是通過(guò)XmlHttpRequest獲取非本頁(yè)內(nèi)容,而jsonp的核心則是動(dòng)態(tài)添加標(biāo)簽來(lái)調(diào)用服務(wù)器提供的js腳本。
3、所以說(shuō),其實(shí)ajax與jsonp的區(qū)別不在于是否跨域,ajax通過(guò)服務(wù)端代理一樣可以實(shí)現(xiàn)跨域,jsonp本身也不排斥同域的數(shù)據(jù)的獲取。
4、還有就是,jsonp是一種方式或者說(shuō)非強(qiáng)制性協(xié)議,如同ajax一樣,它也不一定非要用json格式來(lái)傳遞數(shù)據(jù),如果你愿意,字符串都行,只不過(guò)這樣不利于用jsonp提供公開(kāi)服務(wù)。
總而言之,jsonp不是ajax的一個(gè)特例,哪怕jquery等巨頭把jsonp封裝進(jìn)了ajax,也不能改變著一點(diǎn)!
———————————————————————————————————————————
看了很多網(wǎng)上的資料,拿出通俗易懂的話講解跨域問(wèn)題,以及ajax,jsonp,json的區(qū)別。
【1】ajax和jsonp本質(zhì)上是不同的東西。Ajax是異步的js他的核心是通過(guò)XmlHttpRequest獲取非本頁(yè)內(nèi)容,而jsonp的核心則是動(dòng)態(tài)添加標(biāo)簽來(lái)調(diào)用服務(wù)器提供的js腳本。
【2】ajax和jsonp這兩種技術(shù)很像,目的也一樣,都是請(qǐng)求一個(gè)url,然后把服務(wù)器返回的數(shù)據(jù)進(jìn)行處理,因此jquery類(lèi)庫(kù)把jsonp作為ajax的一種形式進(jìn)行了封裝(其實(shí)并不是一種東西)怪jq嘮?用著爽就好;
【3】出于安全考慮,腳本(AJAX)不能訪問(wèn)非本域的內(nèi)容。但是,靜態(tài)資源是不受域策略限制的,可以加載任意域的腳本、樣式、圖片等靜態(tài)資源,JSOP就是利用這種原理來(lái)實(shí)現(xiàn)跨域獲取數(shù)據(jù)的。
先介紹jsonp的使用方法:
好人做到底源碼給你嘮
$(function(){
$.ajax({
type: "get",
url: "http://apis.juhe.cn/cook/query.php?menu=魚(yú)香肉絲&key=dfed9d599318b17aa073a9337d057e5f",
dataType: "jsonp"
}).done(function (data) {
console.log(data)
})
});
服務(wù)器運(yùn)行的結(jié)果完美跨域獲取到數(shù)據(jù)
再介紹PHP配合ajax跨域:
先建立叫search.php的文件!
內(nèi)容為:
$data =$_POST['data'];
//服務(wù)器來(lái)接收客戶端發(fā)送的數(shù)據(jù)
//服務(wù)器允許 該請(qǐng)求頭進(jìn)行跨域
header("Access-Control-Allow-Origin:http://apis.juhe.cn/cook/query.php?".$data."&key=dfed9d599318b17aa073a9337d057e5f");
// 服務(wù)器獲取數(shù)據(jù)的方式
header('Access-Control-Allow-Methods:GET');
// 動(dòng)態(tài)獲取數(shù)據(jù)地址
$ulr ="http://apis.juhe.cn/cook/query.php?".$data."&key=dfed9d599318b17aa073a9337d057e5f";
// 服務(wù)器講獲取的數(shù)據(jù)轉(zhuǎn)換成JSON格式 返回給客戶端
$html=file_get_contents($ulr);
// 返回客戶端 echo 返回一個(gè)字符串
echo $html;//服務(wù)器來(lái)返回一個(gè) string的 數(shù)據(jù)
?>
Index.html的內(nèi)容為:
運(yùn)行結(jié)果:
最后再說(shuō)一下json和jsonp的區(qū)別json是一種數(shù)據(jù)格式而jsonp是一種跨域的方式根本不是一回事只是名字差不多!