首页 > 其他分享 >JSONP的原理和封装

JSONP的原理和封装

时间:2022-11-02 09:12:04浏览次数:78  
标签:const script callbackId cb 封装 JSONP 原理 id

jsonp是一种跨域通信的手段,它的原理其实很简单:
首先是利用script标签的src属性来实现跨域。
通过将前端方法作为参数传递到服务器端,然后由服务器端注入参数之后再返回,实现服务器端向客户端通信。
由于使用script标签的src属性,因此只支持get方法

//前端代码
<script>
    function JSONP({
        url,
        params = {},
        callbackKey = 'cb',
        callback
    }) {
        // 定义本地的唯一callbackId,若是没有的话则初始化为1
        JSONP.callbackId = JSONP.callbackId || 1;
        let callbackId = JSONP.callbackId;
        // 把要执行的回调加入到JSON对象中,避免污染window
        JSONP.callbacks = JSONP.callbacks || [];
        JSONP.callbacks[callbackId] = callback;
        // 把这个名称加入到参数中: 'cb=JSONP.callbacks[1]'
        params[callbackKey] = `JSONP.callbacks[${callbackId}]`;
        // 得到'id=1&cb=JSONP.callbacks[1]'
        const paramString = Object.keys(params).map(key => {
            return `${key}=${encodeURIComponent(params[key])}`
        }).join('&')
        // 创建 script 标签
        const script = document.createElement('script');
        script.setAttribute('src', `${url}?${paramString}`);
        document.body.appendChild(script);
        // id自增,保证唯一
        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);

标签:const,script,callbackId,cb,封装,JSONP,原理,id
From: https://www.cnblogs.com/Sultan-ST/p/16849858.html

相关文章

  • day23 JSONP讲解
    同源策略(浏览器的一种机制)概述:浏览器为了安全,他产生一种同源策略,这个策略是为了防止一些恶意的请求,保护对应的隐私。同源策略主要是对应三个内容分别为同协议(http/h......
  • day23 同源策略及JSONP
     同源策略(浏览器的一种机制)概述:浏览器为了安全,产生的一种同源策略,这个策略是为了防止一些恶意的请求,保护用户的隐私.同源策略主要有三个内容,分......
  • vue中key有什么作用(key的内部原理)
    虚拟DOM的key的作用:key是虚拟DOM对象的标识,当状态中的数据发生变化的时候,vue会根据新的数据生成新的虚拟DOM,随后vue进新虚拟DOM与旧虚拟DOM的差异比较(1)旧虚拟......
  • ElementUI 图片文件预览插件封装
    ImgViewer.vue<template><Dialogtitle="图片预览":visible.sync="dialogVisible":append-to-body="true"@closed="dialogImageUrl=''"><imgv-if="dialogI......
  • gp map的底层实现原理
    gomap的底层实现是hashtable,根据key查找vlue的时间负责度是O(1)先通过哈希算法得出哈希值对算出来的哈希值进行对槽位总数取模找到对应槽位如果冲突多的话,需要以......
  • day23JSONP
    同源策略(浏览器的一种机制)概述:为了确保浏览器的安全而产生的一种同源策略,为了防止一些恶意的请求和保护对应的隐私同源策略对应的三个问题 同协议(http/https)同ip地址......
  • autoreleas实现原理
    静态库和动态库的区别1、形式上静态库是.a和.framework。动态库是.dylib和.framework,xcode8为.tbd,本质是.dylib2、使用上:静态库,链接时,会被完整的复制到可执行......
  • tensorflow2从入门到精通——自编码器系列原理以及实现
    自编码器无监督学习,常用于数据去噪,数据降维、图像重构无监督学习监督学习样本数据对应着标签,称之为有监督学习难点绝大部分标签为人工标注有些数据对于标注者的先验......
  • C++语言从入门到精通——封装
    C语言封装都可以访问,且不需要权限认证////CreatedbyCWFon2022/10/5.//#include<stdio.h>#include<string.h>#include<stdlib.h>structPerson{charname[64];in......
  • c++从入门到精通——数组类封装以及操作符重载
    #include"myArray.h"MyArray::MyArray(){//cout<<"默认构造函数调用"<<endl;this->m_Capacity=100;this->m_Size=0;this->pAddress=newint[this->m_Cap......