jsonp是一种跨域通信的手段,它的原理其实很简单:
首先是利用script标签的src属性来实现跨域。
通过将前端方法作为参数传递到服务器端,然后由服务器端注入参数之后再返回,实现服务器端向客户端通信。
由于使用script标签的src属性,因此只支持get方法
| //前端代码 |
| <script> |
| function JSONP({ |
| url, |
| params = {}, |
| callbackKey = 'cb', |
| callback |
| }) { |
| |
| JSONP.callbackId = JSONP.callbackId || 1; |
| let callbackId = JSONP.callbackId; |
| |
| JSONP.callbacks = JSONP.callbacks || []; |
| JSONP.callbacks[callbackId] = callback; |
| |
| params[callbackKey] = `JSONP.callbacks[${callbackId}]`; |
| |
| const paramString = Object.keys(params).map(key => { |
| return `${key}=${encodeURIComponent(params[key])}` |
| }).join('&') |
| |
| const script = document.createElement('script'); |
| script.setAttribute('src', `${url}?${paramString}`); |
| document.body.appendChild(script); |
| |
| JSONP.callbackId++; |
| |
| } |
| JSONP({ |
| url: 'http://localhost:8080/api/jsonps', |
| params: { |
| a: '2&b=3', |
| b: '4' |
| }, |
| callbackKey: 'cb', |
| callback (res) { |
| console.log(res) |
| } |
| }) |
| JSONP({ |
| url: 'http://localhost:8080/api/jsonp', |
| params: { |
| id: 1 |
| }, |
| callbackKey: 'cb', |
| callback (res) { |
| console.log(res) |
| } |
| }) |
| </script> |
| |
| const Koa = require('koa'); |
| const app = new Koa(); |
| const items = [{ id: 1, title: 'title1' }, { id: 2, title: 'title2' }] |
| |
| app.use(async (ctx, next) => { |
| if (ctx.path === '/api/jsonp') { |
| const { cb, id } = ctx.query; |
| const title = items.find(item => item.id == id)['title'] |
| ctx.body = `${cb}(${JSON.stringify({title})})`; |
| return; |
| } |
| }) |
| console.log('listen 8080...') |
| app.listen(8080); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!