一、jQuery跨域请求
在Web前端开发中,由于浏览器同源策略的限制,Ajax请求默认不允许向其它域名下的服务的接口发起请求。不过,jQuery提供了一种便捷的跨域请求方式,那就是JSONP。JSONP(JSON with Padding)是一种问答式解决跨域的方法,它利用了<script>
标签的加载跨域资源的特点。
实现原理:当浏览器通过script标签发起请求时,服务器重写响应内容为Javascript调用的格式,然后响应给客户端。客户端解析该脚本并执行,就可以完成跨域请求了。
- jQuery的JSONP方法实现跨域请求:
$.ajax({
url: 'http://www.example.com/interface',
type: 'GET',
dataType: 'jsonp', // 注意:此处dataType为jsonp
success: function(data) {
console.log(data);
}
});
- 服务器端的响应格式示例:
callback({"message": "Hello World!"});
其中,callback
是客户端指定的跨域回调函数名称,可以通过url传递到服务器端。服务器端将请求数据处理后,返回一个JSON格式的数据,并在前面加上callback
的值,构成一个完整的Javascript脚本。当客户端解析该脚本并执行时,就会触发指定名称的回调函数,并将处理后的数据作为参数传递进去。
二、jQuery Ajax模板
使用jQuery Ajax发起跨域请求有多种方式,这里提供一份常用的模板,方便开发者快速上手。
$.ajax({
url: '',
type: 'GET',
dataType: 'jsonp',
data: '',
beforeSend: function(jqXHR) {
// 请求发送前的回调函数
},
success: function(data, textStatus, jqXHR) {
// 请求成功后的回调函数
},
error: function(jqXHR, textStatus, errorThrown) {
// 请求失败后的回调函数
},
complete: function(jqXHR, textStatus) {
// 请求完成后的回调函数,不管成功或失败都会调用
}
});
参数解释:
url
:请求的接口url,可以是完整的url路径或相对路径。type
:请求类型,一般使用GET或POST方法。dataType
:服务器响应的数据类型,可以为json、jsonp、xml、script、html、text。当指定为jsonp时,表示使用JSONP方式跨域。data
:请求发送到服务器的数据,可以是键值对、数组、字符串。beforeSend
:请求发送前的回调函数,可以修改请求头信息,如添加Authorization等。success
:请求成功后的回调函数,参数为服务器响应的数据、状态字符串、jqXHR对象。error
:请求失败后的回调函数,参数为jqXHR对象、状态字符串、错误抛出的异常对象。注意:如果请求为jsonp方式,错误信息可能会在success
回调函数内抛出。complete
:请求完成后的回调函数,参数为jqXHR对象、状态字符串。
三、jQuery的Ajax请求
除了JSONP方式,jQuery还支持CORS(Cross Origin Resource Sharing)方式和Proxy(代理)方式进行跨域请求。
四、jQuery解决跨域
除了使用Ajax的方式以外,还可以通过使用iframe和window.name技术等方式来实现跨域请求。但是这些方式都存在安全性问题,而且效率较低,建议开发者慎用。 总之,从浏览器同源策略的角度出发,Ajax请求默认不允许向其它域名下的服务的接口发起请求。但是,借助jQuery提供的JSONP方式等,开发者可以方便地实现跨域请求。不过,在跨域请求发起前,开发者需要对服务器端进行相应的配置,否则会无法正常获取数据。