JSONP的简单实现

111 阅读1分钟

原理

JSONP is a method for sending JSON data without worrying about cross-domain issues. JSONP does not use the XMLHttpRequest object. JSONP uses the <script> tag instead. 就是说jsonp就是一个发送json数据,而不用担心跨域问题的技术方法。
他不会使用XMLHttpRequest对象,而是利用了script标签src属性没有跨域限制的特性。
由于标签属性src的限制,jsonp只能够进行get请求

使用

  • 前后端商量好一个回调函数cb,并在前端声明定义
  • 后端发送数据时,解析出回调函数,用回调函数,如cb包裹住要发送的数据,如res.end(cb+'({})')
  • 前端新建一个script标签,并将请求地址与调用参数拼接成URL,如http://localhost:3000?callback=cb,并赋值给script标签的src属性
  • script标签请求到数据以后,会自动执行前端定义的回调函数cb

代码

简单实现一下,服务端用node编写。

client.html
<body>
    <script>
        let script = document.createElement('script')
        //2.拼接src,get到数据后将会自动执行回到函数cb(data)
        script.src = "http://localhost:3000?callback=cb"
        document.body.appendChild(script)
    </script>
    <script>
    //1.协调后端,确定回调函数,定义回调函数
        function cb(obj){
            setTimeout(()=>{
            //如果 `document.write()` 调用发生在 HTML 里的 `<script>` 标签中,
            //那么它将不会自动调用,需要一个宏任务等待获取到数据
            document.write(`key:${Object.keys(obj)},value:${Object.values(obj)}`)
            })
        }
    </script>
</body>
server.js
const http = require('http')
const url = require('url')
let count = 0
const server = http.createServer()
server.on('request', (req, res) => {
    const param = url.parse(req.url).query.split('=')//["callback","cb"]
    let callback = param[1]
    console.log("请求",++count);
    res.end(callback+'({"name":"zhangsan"})')//发送cb({data})
})
server.listen(3000, () => {
    console.log("3000端口监听中")
})

结果

image.png