JSONP是前端最常用来处理跨域请求的方法。JSONP是JSON with padding。
JSONP由两部分组成:回调函数和数据。原理是利用<script>标签没有跨域限制。缺点是只支持GET请求,可能夹带恶意的代码和难以确定JSONP请求是否失败。
https://gaoupon.github.io/2016/09/05/前端跨域请求原理及实践/ 贴上一篇比较浅显的博文
这是使用jQuery 封装的客户端发起JSONP请求的模板。(JSONP和AJAX没有关系的,这仅是jQuery的封装)
// 回调函数
function jsonpCallback(data) {
console.log("jsonpCallback: " + data.name)
}
$("#submit").click(function() {
var data = {
name: $("#name").val(),
id: $("#id").val()
};
$.ajax({
url: 'http://localhost:3001/ajax/deal',
data: data,
dataType: 'jsonp',
cache: false,
timeout: 5000,
// jsonp 字段含义为服务器通过什么字段获取回调函数的名称
jsonp: 'callback',
// 声明本地回调函数的名称,jquery 默认随机生成一个函数名称
jsonpCallback: 'jsonpCallback',
success: function(data) {
console.log("ajax success callback: " + data.name)
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(textStatus + ' ' + errorThrown);
}
});
});
对应的服务端代码
app.get('/ajax/deal', function(req, res) {
console.log("server accept: ", req.query.name, req.query.id)
var data = "{" + "name:'" + req.query.name + " - server 3001 process'," + "id:'" + req.query.id + " - server 3001 process'" + "}"
var callback = req.query.callback
var jsonp = callback + '(' + data + ')'
console.log(jsonp)
res.send(jsonp)
res.end()
})
再贴出黄大神的代码(vue-music的作者)
import originJSONP from 'jsonp'
export default function jsonp(url, data, option) {
url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)
return new Promise((resolve, reject) => {
originJSONP(url, option, (err, data) => {
if (!err) {
resolve(data)
} else {
reject(err)
}
})
})
}
function param(data) {
let url = ''
for (var k in data) {
let value = data[k] !== undefined ? data[k] : ''
url += `&${k}=${encodeURIComponent(value)}`
}
return url ? url.substring(1) : ''
}
对应的url,data和option(接口约定字段)请大家根据实际自行填写。