jsonp的原理是使用script标签来实现跨域,因为script标签的的src属性是不受同源策略的影响的,因此可以使用其来跨域。一个最简单的jsonp就是创建一个script标签,设置src为相应的url,在url之后添加相应的callback,格式类似于 url?callback=xxx,服务端根据我们的callback来返回相应的数据,类似于res.send(req.query.callback + '('+ data + ')'),这样就实现了一个最简单的jsonp
补充
补充:JSONP 的核心思路是利用
<script>标签的 src 不受同源策略限制的特性,由服务端把 JSON 数据"包"进一个 JS 函数调用里返回,浏览器拿到这段 JS 直接执行,即可拿到数据。完整流程:
- 客户端定义回调函数(如
jsonpCallback,通常挂到 window 上);- 动态创建
<script src="http://api.xxx.com/data?cb=jsonpCallback">追加到 head;- 服务端收到请求后,把数据序列化为
jsonpCallback({...})字符串返回;- 浏览器执行这段脚本,触发回调拿到数据。
缺点:仅支持 GET、存在安全隐患(任意 JS 会被执行)、错误无法捕获;现代项目通常改用 CORS 或代理。
function jsonp(url, params, callback) {
const cbName = 'jsonp_' + Date.now()
window[cbName] = callback
const qs = Object.keys(params).map(k => `${k}=${params[k]}`).join('&')
const script = document.createElement('script')
script.src = `${url}?${qs}&callback=${cbName}`
document.head.appendChild(script)
}
来源整理自:vue3js.cn 面试官系列



