jsonp原理详解——终于搞清楚jsonp是啥了,rabbitmq原理总结
5、这样,解决方案就呼之欲出了,web服务端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件,显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装进去。
6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来很像ajax,但其实并不一样。
7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,简称JSONP。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名包裹在JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
二、JSONP的客户端实现
1、远程调用其它服务器上的js文件(跨域成功)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><script type="text/javascript" src="http://remoteserver.com/remote.js"></script></head><body></body></html>
2、远程调用js
现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><script type="text/javascript">var localHandler = function(data){alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);};</script><script type="text/javascript" src="http://remoteserver.com/remote.js"></script></head><body></body></html>
remote.js文件代码如下:
localHandler({"result":"我是远程js带来的数据"});
运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据。
很欣喜,跨域远程获取数据的目的基本实现了,但是又一个问题出现了,我怎么让远程js知道它应该调用的本地函数叫什么名字呢?毕竟是jsonp的服务者都要面对很多服务对象,而这些服务对象各自的本地函数都不相同。
3、动态生成js脚本
聪明的开发者很容易想到,只要服务端提供的js脚本是动态生成的就行了呗,这样调用者就可以传一个参数过去告诉服务端,“我想要一段调用xxx函数的js代码,请你返回给我”,于是服务器就可以按照客户端的需求来生成js脚本并响应了。
看jsonp.html页面的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><script type="text/javascript">// 得到航班信息查询结果后的回调函数var flightHandler = function(data){alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');};// 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";// 创建script标签,设置其属性var script = document.createElement('script');script.setAttribute('src', url);// 把script标签加入head,此时调用开始document.getElementsByTagName('head')[0].appendChild(script); </script></head><body></body></html>
这次的代码变化比较大,不再直接把远程js文件写死,而是编码实现动态查询,而这也正是jsonp客户端实现的核心部分,本例中的重点也就在于如何完成jsonp调用的全过程。
我们看到调用的url中传递了一个code参数,告诉服务器我要查的是CA1998次航班的信息,而callback参数则告诉服务器,我的本地回调函数叫做flightHandler,所以请把查询结果传入这个函数中进行调用。
OK,服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html
(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串):
flightHandler({"code": "CA1998","price": 1780,"tickets": 5});
4、封装代码
到这里为止的话,相信你已经能够理解jsonp的客户端实现原理了吧?剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。
jQuery如何实现jsonp调用?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head><title>Untitled Page</title># Spring全套教学资料**Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。****[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)****目录:**![](https://img-blog.csdnimg.cn/img_convert/93bac8bd0b4d91c7e171bdb57ba0258e.png)![](https://img-blog.csdnimg.cn/img_convert/cfb9a2dfd763ebdb944782c1e6cff471.png)**部分内容:**![](https://img-blog.csdnimg.cn/img_convert/e38488e69d6b833b0075ceea0d47f398.png)![](https://img-blog.csdnimg.cn/img_convert/f0e8f64d27939beeba970066007817b5.png)# Spring源码* 第一部分 Spring 概述
* 第二部分 核心思想
* 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
* 第四部分 Spring IOC 高级应用基础特性高级特性
* 第五部分 Spring IOC源码深度剖析设计优雅设计模式注意:原则、方法和技巧
* 第六部分 Spring AOP 应用声明事务控制
* 第七部分 Spring AOP源码深度剖析必要的笔记、必要的图、通俗易懂的语言化解知识难点![](https://img-blog.csdnimg.cn/img_convert/f2657c16c4fa6a41b1ca5a6dde7edced.png)![](https://img-blog.csdnimg.cn/img_convert/68a7e593782c3c05d84d318e10f44c39.png)# 脚手框架:SpringBoot技术> 它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。
>
> Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。* SpringBoot入门
* 配置文件
* 日志
* Web开发
* Docker
* SpringBoot与数据访问
* 启动配置原理
* 自定义starter![](https://img-blog.csdnimg.cn/img_convert/0f21fe89662766127ab0d53852e44c16.png)![](https://img-blog.csdnimg.cn/img_convert/450bc9acfa2709f65e8b1bdab10fa6a0.png)# 微服务架构:Spring Cloud Alibaba> 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。* 微服务架构介绍
* Spring Cloud Alibaba介绍
* 微服务环境搭建
* 服务治理
* 服务容错
* 服务网关
* 链路追踪
* ZipKin集成及数据持久化
* 消息驱动
* 短信服务
* Nacos Confifig—服务配置
* Seata—分布式事务
* Dubbo—rpc通信![](https://img-blog.csdnimg.cn/img_convert/0462d0145314139a4d16517aacc10552.png)![](https://img-blog.csdnimg.cn/img_convert/0d3eed462286a9a528bb7755363b03a5.png)# Spring MVC**目录:**![](https://img-blog.csdnimg.cn/img_convert/8aa8efef8a9d7669bf439a41864140c4.png)![](https://img-blog.csdnimg.cn/img_convert/429068be9259d4f69aa3867694a2d6bb.png)![](https://img-blog.csdnimg.cn/img_convert/29fef5bb2e6f2deb2bc57fd1d79df02b.png)**部分内容:**![](https://img-blog.csdnimg.cn/img_convert/c0534a001500f7e02db13103f69fe93d.png)![](https://img-blog.csdnimg.cn/img_convert/50d51a0519c41aef9586366e5f0b24b4.png)1j6gP-1630469651966)][外链图片转存中...(img-OHpZS9QL-1630469651966)]# Spring MVC**目录:**[外链图片转存中...(img-btdO1RVq-1630469651967)][外链图片转存中...(img-Z5MiSFag-1630469651967)][外链图片转存中...(img-GXOWW0on-1630469651968)]**部分内容:**[外链图片转存中...(img-xt3DLlsT-1630469651969)][外链图片转存中...(img-FAN9uv2z-1630469651969)]
jsonp原理详解——终于搞清楚jsonp是啥了,rabbitmq原理总结相关推荐
- ThreadLocal原理详解--终于弄明白了ThreadLocal
ThreadLocal原理详解 在我看到ThreadLocal这个关键字的时候我是懵逼的,我觉得我需要弄明白,于是,我就利用搜索引擎疯狂查找,试图找到相关的解答,但是结果不尽人意. 首先说一下我的理解 ...
- Android高工:okhttp原理详解,搞懂了直接去虐面试官
当连接池中有连接时:清理任务由cleanup()方法完成,首先执行清理,并返回下次需要清理的间隔时间,调用调用wait() 方法释放锁.等时间到了以后,再次进行清理,并返回下一次需要清理的时间间隔,再 ...
- nginx配置文件及工作原理详解
nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...
- LVS原理详解及部署之五:LVS+keepalived实现负载均衡高可用
本文我们主要讲解的是LVS通过keepalived来实现负载均衡和高可用,而不是我们第三篇文章介绍的通过手动的方式来进行配置.通过脚本的方式来显示RS节点的健康检查和LVS的故障切换.此文会通过一个实 ...
- LVS原理详解及部署之四:keepalived介绍
-------------------LVS专题------------------------ LVS原理详解及部署之一:ARP原理准备 LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调 ...
- Android面试Hash原理详解二
Hash系列目录 Android面试Hash原理详解一 Android面试Hash原理详解二 Android面试Hash常见算法 Android面试Hash算法案例 Android面试Hash原理详解 ...
- Diffusion Model原理详解及源码解析
作者:秃头小苏@CSDN 编辑:3D视觉开发者社区 文章目录 Diffusion Model原理详解及源码解析 写在前面 Diffusion Model原理详解✨✨✨ 整体思路 实施细节 正向过程 逆 ...
- 文本分类算法TextCNN原理详解
详情请看:膜拜大佬![原创]文本分类算法TextCNN原理详解(一) - ModifyBlog - 博客园 Textcnn 原理 与rnn lstm 的比较, Textcnn更快 textCNN的总结 ...
- 激活函数、Sigmoid激活函数、tanh激活函数、ReLU激活函数、Leaky ReLU激活函数、Parametric ReLU激活函数详细介绍及其原理详解
相关文章 梯度下降算法.随机梯度下降算法.动量随机梯度下降算法.AdaGrad算法.RMSProp算法.Adam算法详细介绍及其原理详解 反向传播算法和计算图详细介绍及其原理详解 激活函数.Sigmo ...
最新文章
- linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改
- 设置释放COCOS2D-X 的启动流程
- 网络故障解决方案之非标准子网划分【网管员必懂】
- Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装
- Java虚拟机——Java内存区域与内存溢出
- 【car】购买新能源电动汽车的几个注意事项
- android studio sugar,Android | Sugar 的介绍和简单使用
- param参数服务器
- for循环如果先--_97-for循环嵌套 输出反倒直角三角形
- Python游戏开发! Mac完美安装pygame
- 二级java考什么_​Java计算机二级考试考什么
- 【智能优化算法】基于基于遗传算法实现认知无线电优化求解附matlab代码
- python多条件筛选数据并计数_Numpy | 排序、条件筛选函数、统计函数
- 在 Intel NUC8i7HVK 上安装CentOS7
- 【智能家居】空调遥控器破解
- 汉王速录笔linux驱动下载,汉王速录笔v586s驱动
- 百度网盘新用户超级会员多少钱
- linux如何批量改名,Linux 批量改名之 rename 命令
- Python控制Excel表格的操作以及问题处理
- 百度竞价推广中的,28定律是什么?