ajax实现跨域请求代码实例简单介绍
其实ajax是不具有跨域功能,这里说的ajax是jquery封装后的ajax。
关于原生的ajax相关内容可以参阅ajax教程版本。
实现的原理也是依靠jsonp,关于它的实现原理可以参阅JSONP用法详解一章节。
关于非跨域的使用可以参阅jquery使用ajax读取后台数据在表格中显示一章节。
上一个例子如果使用本站的编辑器运行,当然非跨域使用,但是如果在本地测试,那么就是跨域,肯定会首先。
截图如下:
<!DOCTYPE html> <html> <head> <meta charset=" gb2312"> <meta name="author" content="http://www.pipipi.net/" /> <title>前端教程网</title> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script type="text/javascript"> $(document).ready(function () { $("#bt").click(function () { var str = "<table>"; $.ajax({ url: "http://pipipi.net/demo/ajax/net/jsonp.ashx", data: {}, type: "get", async: true, dataType: "jsonp", jsonp: "jsoncallback", jsonpCallback: "success_jsonpCallback", success: function (json) { $.each(json, function (index, obj) { $.each(obj, function (y, data) { str = str + "<tr>"; str = str + "<td>" + data["username"] + "</td><td>" + data["address"] + "</td><td>" + data["score"] + "</td>"; str = str + "</tr>"; }) }) str = str + "</tr></table>"; $("#antzone").html(str); } }); }) }) </script> </head> <body> <div id="antzone"></div> <input type="button" id="bt" value="查看效果"/> </body> </html>
特别说明:在www.pipipi.net和pipipi.net之间相互访问也属于跨域,所以上面的代码也属于跨域操作。
下面对上面的代码的主要部分进行以下说明:
(1).url: "http://pipipi.net/demo/ajax/net/jsonp.ashx",请求的地址。
(2).data: {},要发动到服务器的数据。
(3).type: "get",规定请求方式。
(4).async: true,异步请求。
(5).dataType: "jsonp",规定是jsonp跨域请求。
(6).jsonp: "jsoncallback",会作为url的一个参数进行传递,pipipi.net?jsoncallback=xxx。
(7).jsonpCallback: "success_jsonpCallback",规定jsoncallback的参数值,pipipi.net?jsoncallback=success_jsonpCallback。
(8).success: function (json),jons是json格式对象。
上面的代码实现了跨域,大家好像没有看到jsonp和jsonpCallback的作用,代码修改如下:
<!DOCTYPE html> <html> <head> <meta charset=" gb2312"> <meta name="author" content="http://www.pipipi.net/" /> <title>前端教程网</title> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script type="text/javascript"> function success_jsonpCallback(obj) { console.log(obj); } $(document).ready(function () { $("#bt").click(function () { var str = "<table>"; $.ajax({ url: "http://pipipi.net/demo/ajax/net/jsonp.ashx", data: {}, type: "get", async: true, dataType: "jsonp", jsonp: "jsoncallback", jsonpCallback: "success_jsonpCallback", success: function (json) { $.each(json, function (index, obj) { $.each(obj, function (y, data) { str = str + "<tr>"; str = str + "<td>" + data["username"] + "</td><td>" + data["address"] + "</td><td>" + data["score"] + "</td>"; str = str + "</tr>"; }) }) str = str + "</tr></table>"; $("#antzone").html(str); } }); }) }) </script> </head> <body> <div id="antzone"></div> <input type="button" id="bt" value="查看效果"/> </body> </html>
上面的代码我们只是在javascript代码的顶部添加如下一段:
function success_jsonpCallback(obj) { console.log(obj); }
控制台数据结果是:
这说明pipipi.net?jsoncallback=success_jsonpCallback传递到后台以后,经过包装又传送到客户端。
后台代码确实如此:
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string callback = context.Request.QueryString["jsoncallback"]; DataSet ds = done(); string jsonStr = GetJsonByDataset(ds); context.Response.Write(callback+"("+jsonStr+")"); }
特别说明:还是要首先看懂jsonp的实现原理,才能够真正明白上面这一切。