JSONP是什么

JSONP(JSON with padding),服务器与客户端跨源通信的常用方法,可以让网页从别的网域获取数据。

JSONP的全部过程

  1. 在页面中创建一个动态的<script>
  2. 通过<script>标签中的src写入对应服务器的地址发出get请求
  3. 服务器接收到请求后,将数据作为参数放到一个指定名字的回调函数里传回来
  • url示例:
    http://www.domain.com:port/path?callback=callbackName
  • 一般callbackName使用随机数生成,为了避免对全局变量造成污染。在调用了回调函数之后,立刻删除这个回调函数。
  • JSONP不支持post请求,因为<script>向浏览器发送的是get请求

JSONP实现的示例

从 domain.com:8081 的客户端向 jack.com:8002 的服务器发送请求

<script>
    let script = document.createElement('script');
    // 设置一个随机数拼接成回调函数的名称
    let name = 'lalala' + parseInt(Math.random() * 10000, 10); 
    // 设置回调函数
    window[name] = function(result){
        console.log(result);
    };
    // 向jack.com:8002发起请求
    script.src = 'http://jack.com:8002/lalala?callback='+name 
     // 动态地创建一个<script>
    document.body.appendChild(script);

    // 获取到请求返回的响应后,删除动态创建的 script 和回调函数
    // 请求成功的操作
    script.onload = function (e) {
        e.currentTarget.remove();
        delete window[name];
    };
     // 请求失败的操作
    script.onerror = function (e) {
        e.currentTarget.remove();
        delete window[name];
    };
</script>

从jack.com:8002 的服务器获取数据的代码:

if (path === '/lalala'){
   // 执行对数据库的操作
   let amount = fs.readFileSync('./db', 'utf8')
   amount -= 1
   fs.writeFileSync('./db', amount)
   // 获取回调函数的名称
   let callbackName = query.callback
   response.setHeader('Content-Type', 'application/javascript')
   // 将响应结果'success'作为参数传入回调函数
   response.write(`
       ${callback}.call(undefined, 'success')
   `)
   response.end()
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前端操作数据库 首先,我们试着通过前端来操作一个数据库。数据库是什么?只要能长久的存数据,就是数据库。文件系统是一...
    是刘快啊阅读 2,953评论 0 2
  • 高级就要跟后台打交道MySQL My是数据库作者女儿的名字 开服务之后,页面如下: 问题:刷新之后,数值又恢复...
    tsl1127阅读 1,716评论 0 0
  • 介绍JSONP之前 ,我们先了解一下,页面数据交互的发展过程。来看下面一个例子。付款是我们日常中常见的一种金钱交易...
    charllote8阅读 3,616评论 0 3
  • https://segmentfault.com/a/1190000007935557 一、JSONP的诞生 首先...
    JamHsiao_aaa4阅读 1,709评论 0 0
  • #sdfdsfds
    小梁匆匆的走了阅读 861评论 0 1