1忠荞、ajax和jsonp這兩種技術在調用方式上“看起來”很像,目的也一樣月匣,都是請求一個url钻洒,然后把服務器返回的數(shù)據(jù)進行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進行了封裝锄开;
2素标、但ajax和jsonp其實本質上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內容萍悴,而jsonp的核心則是動態(tài)添加標簽來調用服務器提供的js腳本头遭。
3、所以說癣诱,其實ajax與jsonp的區(qū)別不在于是否跨域计维,ajax通過服務端代理一樣可以實現(xiàn)跨域,jsonp本身也不排斥同域的數(shù)據(jù)的獲取撕予。
4鲫惶、還有就是,jsonp是一種方式或者說非強制性協(xié)議实抡,如同ajax一樣欠母,它也不一定非要用json格式來傳遞數(shù)據(jù),如果你愿意吆寨,字符串都行赏淌,只不過這樣不利于用jsonp提供公開服務。
總而言之啄清,jsonp不是ajax的一個特例六水,哪怕jquery等巨頭把jsonp封裝進了ajax,也不能改變著一點!
———————————————————————————————————————————
看了很多網上的資料掷贾,拿出通俗易懂的話講解跨域問題睛榄,以及ajax,jsonp想帅,json的區(qū)別懈费。
【1】ajax和jsonp本質上是不同的東西。Ajax是異步的js他的核心是通過XmlHttpRequest獲取非本頁內容博脑,而jsonp的核心則是動態(tài)添加標簽來調用服務器提供的js腳本。
【2】ajax和jsonp這兩種技術很像票罐,目的也一樣叉趣,都是請求一個url,然后把服務器返回的數(shù)據(jù)進行處理该押,因此jquery類庫把jsonp作為ajax的一種形式進行了封裝(其實并不是一種東西)怪jq嘮疗杉?用著爽就好;
【3】出于安全考慮蚕礼,腳本(AJAX)不能訪問非本域的內容烟具。但是,靜態(tài)資源是不受域策略限制的奠蹬,可以加載任意域的腳本朝聋、樣式、圖片等靜態(tài)資源囤躁,JSOP就是利用這種原理來實現(xiàn)跨域獲取數(shù)據(jù)的冀痕。
先介紹jsonp的使用方法:
好人做到底源碼給你嘮
$(function(){
$.ajax({
type: "get",
url: "http://apis.juhe.cn/cook/query.php?menu=魚香肉絲&key=dfed9d599318b17aa073a9337d057e5f",
dataType: "jsonp"
}).done(function (data) {
console.log(data)
})
});
服務器運行的結果完美跨域獲取到數(shù)據(jù)
再介紹PHP配合ajax跨域:
先建立叫search.php的文件!
內容為:
$data =$_POST['data'];
//服務器來接收客戶端發(fā)送的數(shù)據(jù)
//服務器允許 該請求頭進行跨域
header("Access-Control-Allow-Origin:http://apis.juhe.cn/cook/query.php?".$data."&key=dfed9d599318b17aa073a9337d057e5f");
// 服務器獲取數(shù)據(jù)的方式
header('Access-Control-Allow-Methods:GET');
// 動態(tài)獲取數(shù)據(jù)地址
$ulr ="http://apis.juhe.cn/cook/query.php?".$data."&key=dfed9d599318b17aa073a9337d057e5f";
// 服務器講獲取的數(shù)據(jù)轉換成JSON格式 返回給客戶端
$html=file_get_contents($ulr);
// 返回客戶端 echo 返回一個字符串
echo $html;//服務器來返回一個 string的 數(shù)據(jù)
?>
Index.html的內容為:
運行結果:
最后再說一下json和jsonp的區(qū)別json是一種數(shù)據(jù)格式而jsonp是一種跨域的方式根本不是一回事只是名字差不多!