Ajax技术的核心是XMLHttpRequest对象(简称XHR),可以通过使用XHR对象获取到服务器的数据,然后再通过DOM将数据插入到页面中呈现。虽然名字中包含XML,但Ajax通讯与数据格式无关,所以我们的数据格式可以是XML或JSON等格式。
XMLHttpRequest对象用于在后台与服务器交换数据,具体作用如下:
由于同源策略的限制,XMLHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。
- JSONP方式
- 表单POST方式
- 服务器代理
- Html5的XDomainRequest
- Flash request
JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过Javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。原理不多介绍,接下来是示例。
【1】PHP定义的API接口
API的地址为:http://192.168.1.102:8002/regular.PHP
<?PHP //jsonp ajax跨域请求!!! $g_callback = null; if(isset($_REQUEST['jsonp_callback'])) { $g_callback = $_REQUEST['jsonp_callback']; } if (isset($_REQUEST['name'])) { echo jsonencode( array( 'code' => 200,'msg' => '调用成功','result' => array( 'name' => $_REQUEST['name'] ) ),$g_callback ); exit; } else { echo jsonencode( array( 'code' => 400,'msg' => '调用失败','result' => array( 'name' => '' ) ),$g_callback ); exit; } function jsonencode($datas,$callback=null) { $jsonp = null; if (version_compare(PHP_VERSION,'5.3.0') >= 0) { $jsonp = json_encode($datas,JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS); } else { $jsonp = json_encode($datas); } if(!is_null($callback)) return $callback . '(' . $jsonp . ')'; return $jsonp; }
JS的地址为:http://192.168.1.102:8001/index.html
<!DOCTYPE html> <html lang="en"> <head> <Meta charset="UTF-8"> <script type="text/javascript" src="jquery-1.12.2.min.js"></script> <title>ajax 跨域调用</title> </head> <body> <script type="text/javascript"> $(function(){ $.ajax( { type: 'post',async : false,cache : false,dataType : 'jsonp',url : 'http://192.168.1.102:8002/regular.PHP',data: { "name": 'iloveyou',"pass": 'hacfin_token' },jsonp:"jsonp_callback",success : function(data) { alert("code:"+ data.code +" msg:"+ data.msg); },error : function() { alert('fail'); } } ); }) </script> </body> </html>
【3】执行结果