php中ajax跨域請求---小記

前端時間,遇到的一個問題,狀況大約是這樣: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=?"傳給服務器。

jsonpCallback      String

爲jsonp請求指定一個回調函數名。這個值將用來取代jQuery自動生成的隨機函數名。這主要用來讓jQuery生成度獨特的函數名,這樣管理請求更容易,也能方便地提供回調函數和錯誤處理。你也能夠在想讓瀏覽器緩存GET請求的時候,指定這個回調函數名。

 

本身的簡單記錄。。。

相關文章
相關標籤/搜索