使用script标签是如何实现跨域请求的,它是一个新技术,还是一个技巧? 下面我们来看看,其中简单的原理:

我们写一个很平常的example.js,文件内容展示如下:

getJson({results: [{name: 'xxx',code: 1}]
});
复制代码

接下来,再写一个简单的index.html文件:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>jsonp</title><script>function getJson(data) {console.log(data);}</script><script src="http://127.0.0.1:3000/example.js"></script></head><body></body>
</html>
复制代码

上面的index.html代码,当成功的请求到example.js后,相当于这样:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>jsonp</title><script>function getJson(data) {console.log(data);}</script><script>//  这里是:src="http://127.0.0.1:3000/example.js"请求成功后,返回的代码(数据)getJson({results: [{name: 'xxx',code: 1}]});</script></head><body></body>
</html>
复制代码

相信写到这里,是能看得明白的,下面正式开始说JSONP的实现,我用的是nodejs后台:

前端代码index.html,给"http://http://127.0.0.1:3000/example.js"请求地址加一个get请求参数?callback=getJson,代码示例如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>jsonp</title><script>function getJson(data) {console.log(data);}</script><script src="http://127.0.0.1:3000/example.js?callback=getJson"></script></head><body></body>
</html>
复制代码

后端server.js代码如下:

const express = require('express');
const server = express();server.use('/example.js', (req, res) => {// req.query.callback是getJsonlet methodName = req.query.callback; let data = {results: [{name: 'xxx',code: 1}]};let dataStr = JSON.stringify(data),// 相当于sendStr = `getJson(${dataStr})`sendStr = `${methodName}(${dataStr})`;res.send(sendStr);
});server.listen(3000);
console.log('server running at 127.0.0.1:3000');
复制代码

当请求成功后,index.html代码解析如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>jsonp</title><script>function getJson(data) {console.log(data);}</script><script>// 这里是:src="http://127.0.0.1:3000/example.js?callback=getJson"请求成功后,返回的代码(数据)getJson('{"results":[{"name":"xxx","code":1}]}')</script></head><body></body>
</html>
复制代码

最后声明,为了方便大家理解,我把请求写成了一个example.js,其实接口只要一个字符串就可以了,例如"http://127.0.0.1:3000/example?callback=getJson",其中.js文件格式,完全是为了帮助大家理解。

转载于:https://juejin.im/post/5c8c9393e51d452865236ad3

JSONP实现原理-简析相关推荐

  1. Webpack模块化原理简析

    webpack模块化原理简析 1.webpack的核心原理 一切皆模块:在webpack中,css,html.js,静态资源文件等都可以视作模块:便于管理,利于重复利用: 按需加载:进行代码分割,实现 ...

  2. Android Handler与Looper原理简析

    一直感觉自己简直就是一个弱智,最近越来越感觉是这样了,真的希望自己有一天能够认同自己,认同自己. 本文转载于:https://juejin.im/post/59083d7fda2f60005d14ef ...

  3. grpc通信原理_gRPC原理简析

    gRPC原理简析 gRPC是由谷歌提出并开发的RPC协议,gRPC提供了一套机制,使得应用程序之间可以进行通信. 降级开发者的使用门槛,屏蔽网络协议,调用对端的接口就像是调用本地的函数一样.而gRPC ...

  4. Android V1及V2签名原理简析

    Android为了保证系统及应用的安全性,在安装APK的时候需要校验包的完整性,同时,对于覆盖安装的场景还要校验新旧是否匹配,这两者都是通过Android签名机制来进行保证的,本文就简单看下Andro ...

  5. CRC原理简析——史上最清新脱俗简单易懂的CRC解析

    CRC原理简析 1. CRC校验原理 CRC校验原理根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端.当然,这个 ...

  6. Java的定时器Timer和定时任务TimerTask应用以及原理简析

    记录:272 场景:Java JDK自带的定时器Timer和定时任务TimerTask应用以及原理简析.在JDK工具包:java.util中可以找到源码,即java.util.Timer和java.u ...

  7. 转子接地保护原理_发变组转子接地保护原理简析

    发变组转子接地保护原理简析 发电机转子接地故障是常见的故障之一, 发生一点接地, 对发电机本身并不直接构成危 害,此时可通过转移负荷,平稳停机后,再查故障点:若在此基础上又发生另外一点接地, 将会严重 ...

  8. Mysql锁机制及原理简析

    Mysql锁机制及原理简析 一.前言 1.什么是锁? 锁是计算机协调多个进程或线程并发访问某一资源的机制. 锁保证数据并发访问的一致性.有效性: 锁冲突也是影响数据库并发访问性能的一个重要因素. 锁是 ...

  9. JTAG、SWD调试原理简析

    JTAG.SWD调试原理简析 STM32F10xxx使用CortexM-M3内核,该内核内含硬件调试模块,支持复杂的调试操作.硬件调试模块允许内核在取指(指令断点)或访问数据(数据断点)时停止.内核停 ...

最新文章

  1. Realm数据库存储 使用详解
  2. word编辑论文技巧
  3. popup a new windows
  4. PHP中的ob_start用法详解
  5. 剑指offer:二维数组中的查找
  6. 版权归原作者的飞鸽传书(IPMSG)
  7. McAfee ePO4.5 admin账号密码忘记的解决办法
  8. 有关C#中的引用类型的内存问题
  9. MATLAB中的fopen、fclose、fprintf、fscanf、fread、fwrite
  10. Python+Vue计算机毕业设计教学辅助系统vmpc7(源码+程序+LW+部署)
  11. C++ 基础概念(二)
  12. 如何解决Spring在同类方法相互调用中,事务,缓存等注解不生效的问题
  13. Java实现发送邮件(定时自动发送邮件)
  14. RTKLIB_trans_all
  15. 芯片检测(分治法经典问题)
  16. c8051f c语言编程,C8051F SPI接口读写c程序
  17. echarts 设置仪表盘数字的位置_全新数字高尔夫独具的特色!外观前卫紧跟潮流!...
  18. 牛客网Wannafly挑战赛29 B - 白井黑子 乱搞
  19. Python 户外俱乐部·登顶纪念证书生成器
  20. 使用itext7在PDF文件中的指定文字位置添加电子签名图片技术记录

热门文章

  1. 全球及中国4-氨基间甲酚行业应用需求与发展策略分析报告2022版
  2. 做shopee找代运营,如何判断一家代运营公司是否靠谱?
  3. 0X8009310B (ASN:276) win7安装证书时出现错误消息:找不到与此证书文件相关联的证书申请微软官方文档
  4. Linux下安装Jboss
  5. 用VC进行COM编程所必须掌握的理论知识
  6. 中科元素精准饮食治未病干预 李喜贵:签约华佗国药体系建立
  7. 关于 JS 模块化的最佳实践总结
  8. 如何实现微服务架构中的服务发现
  9. 【Luogu1937】仓配置(贪心,线段树)
  10. RDL/RDLC批量单据打印 [转]