jquery Ajax跨域请求
这是jquery api文档对跨域请求的解析:如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用JSONP类型。使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp参数。
我们通过demo来参悟上面的解析:
$.ajax({
type: "get",
url: "http://www.yourdomain.com/site/test",//实际上访问时产生的地址为: http://www.yourdomain.com/site/test?callback=jsonpCallback&id=1
data: { id: },
dataType: "jsonp",
success: function (data) {
alert(data.statu);
},
error: function (XMLHttpRequest,textStatus,errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});
上面就是一个最简单的跨域访问请求了。好了,来说说跟普通ajax的区别。首先实际上访问时的地址为:
http://www.yourdomain.com/site/test?callback=随机数&id=10。参照api定义:
使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。
这个随机数是jQuery自动生成的。采用jsonp类型情况下,最终生成的url就是如此的。
接下来,看看后台:
服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。
这是服务器(C# MVC)的代码:
[HttpGet]
public string test(string callback, string id)
{
return callback + "(" + "{\"statu\":" + id + "});";
}
一个有效的JSONP请求,需要在JSON数据前加上回调函数名。回调函数名是上面url中callback传递过来的值。此时服务器传递过来的值为:
jQuery18308788135794457048_1419557549884({"statu":""});
alert(data.statu);也能正确的输出“1”。有人会说json数据前还有回调函数名么,不用处理也能正常输出data.statu??是的,这就是JSONP。
至此,API的前3句已经解析清楚了。就剩后半句了。上面的callback是jQuery随机生成的,回调函数名也是固定为callback,倘若用户要自己定义呢?这就需要用到最后一句话了。
如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp参数。
ajax代码如下:
$.ajax({
type: "get",
url: "http://www.yourdomain.com/site/test",//实际上访问时产生的地址为: http://www.yourdomain.com/site/test?mycallback=jsonpCallback&id=1
data: { id: },
dataType: "jsonp",
jsonp: "mycallback",
jsonCallback: "jsonpCallback",
success: function (data) {
alert(data.statu);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
} });
看到代码应该懂了吧。jsonp属性是设置传递过去的请求参数名的。jsonCallback属性则是自定义传递过去的参数。此时实际访问的url为:
http://www.yourdomain.com/site/test?mycallback=jsonpCallback&id=1 接下来就不细说了。后台接收代码:
[HttpGet]
public string test(string mycallback, string id)
{
return mycallback + "(" + "{\"statu\":" + id + "});";
}
接收过来的数据:
jsonpCallback({"statu":""});
强调一下的就是。JSONP类型 ajax只支持get请求,post请求的情况已经测试过,是不行的。
至此,api的解析全部解析透了。
接下来,就是曲折版了。
function test() {
alert("I am back~~");
}
$.ajax({
type: "get",
//async: false,
url: "http://www.yourdomain.com/site/test", //实际上访问时产生的地址为: test?callback=jsonpCallback&id=10
data: { id: },
cache: false, //默认值true
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback:"test",
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
//如果这里自定了jsonp的回调函数,则回调函数先起作用,后是success函数
success: function (data) {
alert(data.statu);
//alert(json.message);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});
假如你传递过去的jsonpCallback参数为一js函数的话,也是可以的。成功回调之后,会首先调用jsonpCallback函数,然后是success函数。也就是会先alert("I am back~"),后alert(10)。
注意:jsonpCallback属性不能为匿名函数。即不能如下:
$.ajax({
type: "get",
//async: false,
url: "http://www.yourdomain.com/site/test4", //实际上访问时产生的地址为: test4?callback=undefinedk&id=10
data: { id: },
cache: false, //默认值true
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback: function () { },
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
//如果这里自定了jsonp的回调函数,则回调函数先起作用,后是success函数
success: function (data) {
alert(data.statu);
//alert(json.message);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});
这样的话,能正常返回。但是会先跑匿名函数,然后跑error函数。
jquery Ajax跨域请求的更多相关文章
- NodeJ node.js Jquery Ajax 跨域请求
Jquery + Ajax 跨域请求 说白了就是前台请求ajax数据(JSON)但是请求的数据不在本地的绝对路径下,接口数据 是没有这个安全性的我对外公开的接口数据,只要你找到接口你就可以使用里面的数 ...
- jQuery ajax跨域请求的解决方法
在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...
- jquery ajax跨域请求详解
本文章来给大家详细jquery中的ajax跨域请求, 在JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的jquery.ajax jsonp格式和jque ...
- jquery+ajax跨域请求webservice
最近几天在学习webservice...在学习的时候便想到用ajax的方式去请求webservice.. 一直在测试..如果这个被请求的webservice和自己使用的是同一个端口号.则不用考虑那aj ...
- jQuery AJAX 跨域请求
跨域请求 只要 dataType : 'jsonp', jsonp:"jsoncallback", 然后返回一个json格式的就可以了 <!doctype html> ...
- jquery.ajax 跨域请求webapi,设置headers
解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 1.第一步 服务端 ...
- 关于jquery ajax跨域请求获取response headers问题
背景:最近项目jwt用户认证方式,关于jwt本人就不再赘述,大家可自行百度. jwt token基本流程是这样的: 用户使用用户名密码来请求服务器 服务器进行验证用户的信息 服务器通过验证发送给用户一 ...
- jquery ajax跨域请求后台的简单例子
一.简介AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. ajax() 方法通过 HTTP 请求加载远程数据. 该方法是 jQuery 底层 AJAX 实现.简 ...
- jquery ajax跨域请求webservice webconfig配置
<configuration> <system.web> <compilation debug="true" targetFramework=&quo ...
随机推荐
- js 日期正则 转载
天秤水的Blog 博客园 博问 闪存 首页 新随笔 联系 管理 订阅 随笔- 70 文章- 0 评论- 74 最强日期正则表达式 一.简单的日期判断(YYYY/MM/DD): ^\d{ ...
- Hibernate学习3—映射对象标识符(OID)
一.Hibernate 用对象标识符(OID)来区分对象 作如下代码的实验: public class StudentTest { public static void main(String[] a ...
- 慢日志之二:ERROR 1146 (42S02): Table 'mysql.slow_log' doesn't exist,分析诊断工具之四
去查看最新的slow log,发现没有最新的记录,上去检查slow log是否开启了. MySQL> show variables like '%slow%'; +--------------- ...
- Html5 input日期时间输入类型标签赋值 正确的格式应该是value="2014-03-15T08:00"
自己也亲测了!T在php的date函数中格式化后是CST 所以不能写成date('Y-m-dTH:i:s',time()) 得把把年月日和时间用date函数分别格式化 再用大写T分割开 放在v ...
- 详解AJAX核心中的XMLHttpRequest对象
转自:http://developer.51cto.com/art/200904/119577.htm XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHtt ...
- C++类够做函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample{ public: int a; float b; C ...
- 【BZOJ】1001: [BeiJing2006]狼抓兔子(最小割 / 对偶图)
题目 传送门:QWQ 分析 显然答案是最小割. 然后dinic卡一卡过去了. 其实是懒得写转对偶图:正解 (dinic原来写的是vector,后来改的比较鬼畜 代码 #include <bits ...
- 渗透辅助神器 - DZGEN
项目地址:https://github.com/joker25000/DZGEN git clone ┌─[root@sch01ar]─[/sch01ar] └──╼ #git clone https ...
- EasyUI介绍及常见问题
JQuery Easy UI介绍 1.JQuery Easy UI环境搭建和调试: https://jingyan.baidu.com/article/67508eb4342f9f9cca1ce426 ...
- 如何做一款自己的Android App
转自:http://www.cnblogs.com/hubcarl/p/4030884.html 正在做App,后续补充: 概述:以我开发的一款编程学习的App[编程在线]为例讲讲如何做一款自己的An ...