前端時間,遇到的一個問題,狀況大約是這樣:php
原來的寫法:前端
前端js文件中:ajax
$.ajax({json
type:'get',跨域
url:'http://wan.xxx.com/xxx.js',瀏覽器
success:function(data){緩存
......... 服務器
}curl
})函數
很簡單的一個ajax請求;後面在作遷移的時候,因爲系統目錄的安排,js文件放到了,img.xxx.com域名下,這樣就設計到了跨域問題,因而就改爲了這樣:
$.ajax({
type:'get',
url:'http://img.xxx.com/xxx.js',
dataType:'jsonp',
success:function(data){
.........
}
})
用jsonp的形式,跨域請求,這原本沒有什麼,很簡單的,可這樣請求後,就是得不到數據,不知道你們能不能看出問題所在?
跨域請求嘛,就是 dataType用jsonp的格式就對了,可就是不行。。。
後面想了一會,依然無解,後通過同窗的幫助,才知道是這個問題:
跨域請求,須要有一個callback的回調函數,但是上邊請求的url中,雖然是請求的另外一個域中的文件,可並無回調函數(請求的是另個域中的js文件,並無回調函數);
因此,解決方法也就是,經過後臺程序,寫個回調函數便可,而要求必需要請求那個js文件獲得json數據,
因此須要後臺的方法代理一下請求,從而實現要求,就是作一個後臺的代理
因此修改方法以下:
js文件中:
$.ajax({
type:'get',
url:'http://test.com/1.php', //請求的後臺代理文件
data:'url=http://img.xxx.com/xxx.js', //傳遞請求的js地址
dataType:'jsonp',
success:function(data){
........
}
})
後臺代理文件中:
1.php
$url=$_REQUEST[url];
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);
$data=curl_exec($ch); //$data即爲請求傳遞過來的url獲得的json數據
curl_close($ch);
echo $_REQUEST['callback'].."('{$data}');";
這樣就能夠實現功能,只不過多了一步後臺代理的步驟;
順便記一下:
ajax中的跨域的幾個參數:
jsonp String
在一個jsonp請求中重寫回調函數的名字。這個值用來替代在"callback=?"這種GET或POST請求中URL參數裏的"callback"部分,好比{jsonp:'onJsonPLoad'}會致使將"onJsonPLoad=?"傳給服務器。
爲jsonp請求指定一個回調函數名。這個值將用來取代jQuery自動生成的隨機函數名。這主要用來讓jQuery生成度獨特的函數名,這樣管理請求更容易,也能方便地提供回調函數和錯誤處理。你也能夠在想讓瀏覽器緩存GET請求的時候,指定這個回調函數名。
本身的簡單記錄。。。