2013年2月20日 星期三

用 jQuery 以 JSONP 方式取得跨網域資料

JSONP 是利用在頁面生成 <script src="跨網域.js"></script> 的方式來取得跨網域的資料,
這可以解決 AJAX 不能直接跨網域的問題。
(註:除了 JSONP,也可用 AJAX + 另外一支讀取跨網域資料的伺服器端程式,亦能讀取跨網域資料)


而 jQuery 也將 JSONP 的方法,加到 AJAX 的 API 中,所以使用方式跟 AJAX 差不多。

以下範例是 http://example.com/1.php 取得跨網域 http://ff.example.com/2.php 的資料。

  1. http://example.com/1.php 內容如下
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script type="text/javascript">
    $(function(){
        $.ajax({
             type: "get",
             async: false,
             url: "http://ff.example.com/2.php",
             dataType: "jsonp",//指定以jsonp方式執行
             jsonp: "mycallback",//"mycallback"會以GET的變數名稱傳送,沒指定時,jQuery使用"callback"當變數名稱
             jsonpCallback:'aaaa',//"mycallback"變數的值,沒指定時,jQuery隨機產生
             success: function(res){
                 alert(res.msg);
             },
             error: function(){
                 alert('fail');
             }
         });
     });
    </script>
    </head>
    <body>
    </body>
    </html>
    

  2. http://ff.example.com/2.php 內容如下,因前面指定 "mycallback" 為變數名稱,所以這邊用 $_GET["mycallback"] 取得該變數。
    <?php echo $_GET["mycallback"] ?>({
        msg: "jsonp test"
    })
    

  3. 執行 http://example.com/1.php 時,JSONP 在背景 request 的 URL 為
    http://ff.example.com/2.php?mycallback=aaaa&_=1361294981268
    
    執行後,回傳的結果為
    aaaa({
        msg: "jsonp test"
    })
    

  4. 執行 http://example.com/1.php 時,若將 jsonpCallback:'aaaa' 這行拿掉時,JSONP 在背景 request 的 URL 如下,此時 mycallback 傳送出去的值,將是 jQuery 隨機產生的
    http://ff.example.com/2.php?mycallback=jQuery19109647663270832252_1361263744783&_=1361263744784
    
    執行後,回傳的結果
    jQuery19109647663270832252_1361263744783({
        msg: "jsonp test"
    })
    

沒有留言:

張貼留言