# RequireJS (四)
RequireJS 实现 JSONP 服务。
# 传统的 JSONP 服务
由于浏览器同源策略的影响,Ajax 请求不能跨域获取数据。
所谓"同源"指的是"三个相同":
- 协议相同
- 域名相同
- 端口相同
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。如果非同源,共有三种行为受到限制:
- Cookie、LocalStorage 和 IndexDB 无法读取。
- DOM 无法获得。
- AJAX 请求不能发送。
那么 Ajax 请求如何规避这个限制呢?JSONP 就是服务器与客户端跨源通信的常用方法。
JSONP 的基本思想是,网页通过添加一个 <script>
元素,向服务器请求 JSON 数据,由于这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
/**
* @param src 请求地址
* @param callback 请求完成后执行的回调函数的函数名,这里设置为 loaded
*/
function getDataByJsonp(src, callback) {
var url = src + '?callback=' + callback
var script = document.createElement('script')
script.setAttribute('type', 'text/javascript')
script.src = url
document.body.appendChild(script)
}
// 后台接收到请求后返回立即执行的函数,函数名为请求中所带参数指定的函数(callback),本次实例即为 loaded
// 并把需要获取的数据以参数的形式传入该函数
// 后台返回的数据形式
loaded({
id: 1,
userName: 'Anani',
age: 24,
})
// 最后申明一个 callback 函数,这里即为 loaded 函数,它将会在请求成功后立即执行
function loaded(arg) {
console.log(arg)
}
# RequireJS 的 JSONP 服务
前面介绍到 RequireJS 的运行机制是通过 script
标签来加载模块,所以我们也可以通过 RequireJS 来实现 JSONP 服务。
在使用 RequireJS 实现 JSONP 服务时,我们需要把后台返回的数据写成 define()
函数的形式。
// 后台的数据形式
define({
id: 1,
userName: 'Anani',
age: 24,
})
// RequireJS 跨域获取数据
require(['url'], function(arg) {
console.log(arg)
})