位置: 编程技术 - 正文

基于JSONP原理解析(推荐)(jsoncpp rapidjson)

编辑:rootadmin

推荐整理分享基于JSONP原理解析(推荐)(jsoncpp rapidjson),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:jsoncpp使用,jsonp实现原理解析,jsonp实现原理解析,jsonp工作原理,jsonp实现原理解析,jsonp实现原理解析,json原理及简单实现,jsonp实现原理解析,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

我工作以来接触的第一个项目就是前后端分离的,前端静态文件有自己独立域名,通过接口来获取数据进行渲染等操作。

跨域的方法不需要多言,随便一搜,就有很多,但最常用不外乎jsonp和CORS。jsonp着重于前端,也算是前端Hack技巧,CORS重于后端,服务端需要配置的地方会较多。

这篇解析一下jsonp的实现原理。

基本原理

基本原理很容易说明白,在html页面中有一些标签是不受跨域限制的,比如img,script,link等。如果把我们需要的数据,放在一个js文件里面,这时,我们就能突破浏览器同源的限制。

创建script标签

《高性能JavaScript》中提到了动态脚本元素,作者写道:

1、文件在该元素被添加到页面时开始下载。这种技术的重点在于:无论何时启动下载,文件的下载和执行过程不会阻塞页面其他进程。

2、使用动态脚本节点下载文件时,返回的代码通常会立刻执行(除了Firefox和Oprea,它们会等待此前所有动态脚本节点执行完毕。)当脚本自执行时,这种机制运行正常。

引用1保证了JSONP请求的时候不会阻塞主线程,引用2保证了JSONP代码在加载完成后,立刻自执行时不会出错。

callback

服务端在接收到GET请求之后,通常要判断是否有callback参数,如果有,则需要在返回的数据外面加上一个方法名和括号。例如,发起如下请求:

那么服务端就会返回如下内容:

很明显,由于这是在动态加载的Script标签中包含的内容,那么这就是一段自执行代码,这段代码只有一个函数被调用———jsonp0。

基于JSONP原理解析(推荐)(jsoncpp rapidjson)

当然,有执行,则必须先创建,否则就会报错。创建这一步,就需要在调用前执行。

具体实现如下:

上面基本上完成了一个jsonp方法的核心,此时,jsonp0是我们声明好的一个函数,如果服务端正常回传的时候,就会执行jsonp0函数,里面的successCallback回调也会执行。

完善一下

在实际情况下,通常会有许多个jsonp的请求同时调用,

那么既然jsonp0就能满足我们的需要,为什么常常看到jsonp1,jsonp2等等依次累加的代码呢?

这是因为,请求可能是很多个异步进行。在第一次执行jsonp方法时,window.jsonp0是函数A,此时去加载js文件,在js未加载完毕的情况下,又调用了一次jsonp方法,此时,window.jsonp0指向了函数B。那么等到两次的js加载完毕以后,都会执行第二次的回调。

所以,我们需要对callback的名字做一个区别处理,累加就能满足需要。

修改一下代码:

加入了累加和清理之后,还有一个重要的地方需要处理,就是错误回调。正常来说,我们通常请求jsonp时,会设定一个超时时间,如果超过这个时间以后,就抛出超时异常。

实现如下:

这样,基本上就完成了jsonp的全部功能,剩下的可能需要做一些兼容的修改,才算是一个完整的jsonp方法。

REFER

《高性能JavaScript》

npm上的一个jsonp实现,JSONP

以上这篇基于JSONP原理解析(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

基于JavaScript中字符串的match与replace方法(详解) 1、match方法match()方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。match()方法的返回值为:存放匹配结果的数组。2、replace方法repl

深入浅出webpack之externals的使用 我们通常在做项目时可能会把第三方库打包到bundle中,比如下面这张图如果不想把第三方库打包到bundle中,这就有了externals。官方的使用externals比较简

bootstrap3中container与container_fluid外层容器的区别讲解 .container与.container_fluid是bootstrap中的两种不同类型的外层容器,按照官方的说法,这两者的区别是:.container类用于固定宽度并支持响应式布局的容器。.c

标签: jsoncpp rapidjson

本文链接地址:https://www.jiuchutong.com/biancheng/373323.html 转载请保留说明!

上一篇:利用Javascript获取选择文本所在的句子详解(js 获取ua)

下一篇:基于JavaScript中字符串的match与replace方法(详解)(javascript例子)

  • 印花税计算是含增值税吗
  • 综合收入扣税
  • 什么情况下进项税额需要转出
  • 国际快递货运
  • 个体户定额多少不用交税
  • 支付货代运费账务处理
  • 财产租赁合同印花税率多少
  • 用于连续生产的消费税计入
  • 计提残疾人保障金会计分录
  • 无形资产土地使用权摊销年限规定
  • 农产品加计扣除政策2023最新
  • 处于成熟期的企业其预算模式的特点是以什么为起点
  • 个人所得税退税截止日期2023
  • 会计里面红字冲销是什么意思
  • 商业承兑汇票贴现为什么是短期借款
  • 经营性租入的固定资产需要计提折旧吗
  • 专票电话写错了怎么办
  • 注册了店面没有营业执照
  • 暂估成本后第二年收到发票怎么做账
  • 住房公积金是否全国联网
  • 企业分立账务处理办法
  • 利润表的以前年度损益调整影响利润总额吗
  • 原材料到半成品分录
  • 建筑企业挂靠账务怎么处理?
  • 应收票据贴现的会计分录
  • thinkphp钩子场景
  • 分期付款购买固定资产折现率怎么算
  • 职工教育经费超过扣除限额的时候调增还是调减
  • csinject.exe是什么程序的进程 csinject进程是安全的吗
  • win10教育版升级win11
  • 支付押金无法付款
  • 无形资产的账务处理候文江视频
  • 试运行期间收入和成本怎么记账
  • swiper.js常用功能
  • thinkPHP中_initialize方法实例分析
  • php教程从入门到精通
  • php 7.4
  • 罚款是否需要开证明
  • 销售旧货和销售使用过的物品税率
  • 商贸公司库存商品怎么做分录
  • 电费账务qc
  • 个税申报系统累计收入怎么算
  • 自然人独资企业需要交企业所得税吗
  • 其他货币资金是什么科目
  • sql server如何删除
  • db2 select as
  • 工伤鉴定费计入什么科目
  • 公司不注销会坐牢吗
  • 无票收入怎么计算
  • 2019员工旅游费最新规定
  • 固定资产报废后怎么处理
  • 调整以前年度销项税额的分录
  • 增资后持股比例计算
  • 出口退税备案完事了,为什么还没有退税勾选那个模块
  • 免费样品要交税么
  • 外账进销存单据是怎么弄的?
  • 新公司季初资产总额填什么
  • 开服装店如何做销售
  • 留存收益和未分配利润一样吗
  • 资产负债表怎么看财务状况
  • centos开机自动运行
  • w7定时自动关机
  • sdstat.exe - sdstat是什么进程 有什么用
  • kenmail.exe进程有什么用 是什么进程 kenmail进程查询
  • gnaupdaemon.exe是什么
  • 解决VMware下64位linux系统不支持全虚拟化的办法
  • 如何禁用ipv6地址
  • 如何在win7上打开win10软件
  • onclick和onclientclick
  • ie在支持ftp的功能方面
  • unity3d制作ui
  • android fragmentactivity
  • Python内置的HTTP协议服务器SimpleHTTPServer使用指南
  • 方块大作战百科
  • 用javascript
  • python定义全局
  • 建筑行业增值税税收优惠政策
  • 演员个人所得税2023
  • 江苏国税电子税务局官网
  • 城市建设维护税减免政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设