jsonp介绍

news2025/1/16 21:12:41

为什么要知道jsonp,jsonp的作用是什么:

  • Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)获取资料,即跨域读取数据
  • 原则上浏览器是不允许请求不同域名的数据的,但是跨域取数据是经常要用的,jsonp就可以解决这个问题。
  • 为什么我们从不同的域(网站)访问数据需要一个特殊的技术( JSONP )呢?这是因为同源策略。

同源策略介绍: 

  • 同源策略:同域名 同端口号 同协议; 
  • 浏览器有一个“同源策略”的规则: 只有在同域名同端口号和同协议下才能进行数据的请求和传输;
  • 不符合同源策略的,浏览器为了安全,会阻止请求;

针对同源策略的解决办法:

  • 为了能够访问到不同域名的数据,有两种解决办法:
  • 第一就是:cors,由后端设置:Access-Control-Allow-Origin:*
  • 这也就是为什么有一些数据可以跨域访问,因为它们后端设置了允许指定接口或者允许所有接口去访问;
  • 这个设置可以在Response Headers里看到;

CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制;

  • 第二就是:jsonp,由前后端协作去设置; 

 jsonp的设置:

  • 第一种解决办法cors因为是后端设置的,我们无法控制,那我们就可以去控制jsonp来实现跨域问题;

jsonp的原理(面试重点)

  • 动态创建script标签,src属性指向没有跨域限制;指向一个接口,接口返回的格式一定是***()函数表达式

 代码解释:

  • 访问的接口数据是:

  • 代码: 
<body>
    <button id="mybtn">jsonp</button>

    <script>
        //调用这个数据里面的函数,拿回来请求的数据
        function callbackFunction(obj) {
            console.log(obj)
        }

        mybtn.onclick = function () {
            var oscript = document.createElement("script")//动态创建script节点
            oscript.src = `https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction`//请求数据的地址
            document.body.appendChild(oscript)//将节点插入到body里面
        }
    </script>
</body>
  • 结果:

设置jsonp要满足的条件是:就是满足原理的几点

  • 动态创建script标签;
  • 指向一个接口,这个接口里的数据必须是“函数名([ ])”这样格式的;
  • 所以这就需要后端配合,后端接口形式必须是“函数名([ ])”的;
  • 而且要在代码中调用这个函数,也就是这段代码的含义:

  • 这个函数名要和网址中的函数名保持一致,不一致拿不到数据;
  • 这时候我们可以前端设置这个接口名字,也就是这个函数名,因为我们刚开始调用这个函数的时候,不知道这个函数名是什么,这时候我们就可以使用我们自己定义的函数名,然后更改网址中的路径;

把这个函数名改成我们自己定义的,访问这个地址:

 结果:

 然后结果也能拿到我们要的数据:

jsonp设置的缺点: 

两个缺点:

  • onload删除script标签;
  • 只能get请求,不能post、put、patch、delete请求;

  • 删除script标签: 
  • 我们在设置jsonp时,会出现的一个问题是:我们每请求一次数据它就动态创建了一个script节点把它插入到body里面,我们其实代码中创建完script,第二步设置src,在第三步将script标签插入到body里,就拿到数据了,但是我们没必要留着这个script标签,所以就要在插入标签,拿到数据以后,就把这个标签给删了。
  • 所以我们需要有一个删除script节点的事情要做:

  • 插入了很多script标签:

删除代码:

oscript.onload = function(){
                //删除当前节点
                oscript.remove()
            }

完整代码: 

<body>
    <button id="mybtn">jsonp</button>
    <script>
        //调用这个数据里面的函数,拿回来请求的数据
        function test(obj) {
            console.log(obj)
        }
        mybtn.onclick = function () {
            var oscript = document.createElement("script")//动态创建script节点
            oscript.src = `https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=test`//请求数据的地址
            document.body.appendChild(oscript)//将节点插入到body里面

            oscript.onload = function(){
                //删除当前节点
                oscript.remove()
            }
        }
    </script>
</body>
  • 就是先把这个script标签插入到body中,然后再把它删掉,这样我们已经拿到数据了, 标签留着也没用了;

这里纠正一个错误的认识:

  • 有些人可能觉得既然要把插入的script删掉,那就当初不要插入标签,因为第二步设置完了src路径以后,不就拿到数据了。
  • 不是的
  • 这里是第一步创建script标签,第二步设置src路径,第三步是将script标签插入到body里;
  • 只有当最后一步将script标签插入到body里才能拿到数据,并不是第二步就拿到数据了;
  • 所以我们需要先把script标签插入到body里,然后拿到数据以后,再删除script标签。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识付费小程序的作用_知识付费小程序有哪些功能

在线知识付费产业的主要业务逻辑是基于用户的主动学习需求&#xff0c;为其提供以跨领域基础知识与技能为核心的在线知识服务&#xff0c;提升其达到求知目的的效率。公众号和小程序的迅速发展&#xff0c;又为知识付费提供了技术支持&#xff0c;从而促进了行业的进一步发展。…

skywalking部署

一.到apache 上下载 skywalking的git上下载包&#xff0c;选择对应的版本 Downloads | Apache SkyWalking 二.选择完后会跳转到对应的apache下载地址&#xff0c;点击下载 Apache Downloads 三.将下载好的压缩包进行解压&#xff0c;我下载的是8.8.1版本 tar -xf apache-sky…

C++11初篇(快速了解)

文章目录1. C11简介2. 统一的列表初始化2.1 &#xff5b;&#xff5d;初始化2.2 std::initializer_list3. 声明3.1 auto3.2 decltype3.3 nullptr4 范围for循环1. C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C1…

爱婴室主要股东再现减持:莫锐伟、王云亦是如此,业绩表现不理想

一波刚平&#xff0c;一波又起。 11月15日&#xff0c;爱婴室&#xff08;SH:603214&#xff09;发布《关于持股5%以上股东减持股份计划公告》&#xff0c;称该公司持股16.09%的股东合众投资拟通过集中竞价、及/或大宗交易方式减持持有的公司股份不超过843.1015万股&#xff0…

基于Java+JSP+MySQL基于SSM的物流公司物流订单管理系统-计算机毕业设计

项目介绍 随着我国经济的高速增长&#xff0c;物流快递的数量也在不断的增加&#xff0c;同时面临的就是如何更加方便快捷和高效的管理物流订单的问题&#xff0c;传统模式的物流订单管理模式明显已经不能够满足当下的需求&#xff0c;于是我们提出了基于B/S的贴心物流公司物流…

leetcode118 -- 杨辉三角

文章目录一. 问题描述示例 1示例 2提示二. 解决问题主函数&#xff1a;法一&#xff1a;递归1. 解题思路2. 解题代码法二&#xff1a;动态规划1. 解题思路2. 解题代码法三&#xff1a;暴力破解1. 解题思路2. 解题代码一. 问题描述 给定一个非负整数 numRows&#xff0c;生成「…

案例驱动,手把手教你学PyTorch(一)

通过案例学PyTorch。 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 介绍 PyTorch是增长最快的深度学习框架&#xff0c; Fast.ai在其 MOOC、Deep Learning for Coders及其库中也使用了它。 PyTorch 也非常Python 化&#xff0c;也就是说&am…

ubuntu18.04编译GB28181Server

目录一、简绍二、项目依赖的第三方库2.1 jrtplib2.1.1 编译JRTPLIB2.2 mxml2.2.1 编译mxml2.3 osip2/exosip22.3.1 编译osip22.3.2 编译exosip22.4 ffmpeg2.5 提示三、修改GB28181Server3.1 修改GB28181Server.pri3.2 修改AppConfig.cpp3.3 修改GB28181Server.cpp3.4 修改RtpRe…

Java 查漏补缺

文章目录1. Rest风格# 传统访问# Rest风格# Restful开发中的注解介绍2. controller中路径参数3. 约束Controller中方法的请求类型4. 视图跳转5. java.sql.Date 和 java.util.Date 的联系和区别6. 使用 Slf4j 日志7.定时任务81. Rest风格 Rest也叫做范文资源的形式&#xff0c;…

最简单的git图解(系列一)

git clone: 这个命令用于将远程代码仓库克隆到本地&#xff0c;这是对任何项目进行开发前的第一步。 比如你本地本来并没有某个项目的代码仓库&#xff0c;此时随便找一个文件目录并进入cmd命令窗口&#xff0c;执行命令git clone [remote address]&#xff0c;[remote addres…

SQL 50 题(MySQL 版,包括建库建表、插入数据等完整过程,适合复习 SQL 知识点)

目录1.建库建表2.插入数据3.SQL 50 题3.1.SQL 01——查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.2.SQL 02——查询"01"课程比"02"课程成绩低的学生的信息及课程分数3.3.SQL 03——查询平均成绩大于等于 60 分的同学的学生编…

SMP多核启动(一):spin-table

前言 看这篇文章&#xff0c;你必备的一些前置知识有如下 1、ATF启动流程 2、PSCI电源管理的概念 3、设备树 如果没有&#xff0c;可以去我的专栏目录下逛逛&#xff0c;会有所收获。 1、SMP是什么&#xff1f; SMP 英文为Symmetric Multi-Processing &#xff0c;是对称多…

Vscode环境下的PyQt

一、环境配置 ①在Conda控制台下执行以下两条命令&#xff0c;添加开发环境 pip install PyQt5 pip install PyQt5-Tools ②找到designer.exe并运行 文件在哪网上说法千奇百怪&#xff0c;我建议还不如装个everything直接在C盘做全局搜索来得快&#xff0c;实在不想装的话可以…

C轮累积融资1亿美金 禾多科技如何靠自我造血能力赢得资本青睐?

自动驾驶当前在全球范围内受到广泛关注&#xff0c;是汽车行业正在集中力量攻克的新领域。据英特尔预计&#xff0c;2050年仅自动驾驶汽车的市场规模将达到7万亿美元。引得资本和科技巨头们纷纷“下注”。 近日&#xff0c;全栈自动驾驶科技公司禾多科技宣布&#xff0c;已完成…

Redis主从结构数据同步分析

Redis主从结构有两种部署方式&#xff0c;如下&#xff1a; 一主多从的模式是使用最多的模式&#xff0c;通常搭建哨兵或者集群都采用这种方式&#xff0c;但是这种方式主节点复制压力较大&#xff0c;尤其是全量同步的时候。 级联结构使用情况相对较少&#xff0c;这种结构中间…

前端AST详解,手写babel插件

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;专注于前端领域各种技术&#xff0c;热衷分享&#xff0c;关注我会给你带来一些不一样的认知和成长。 &#x1f4dd;个人签名&#xff1a;不破不立 &#x1f36c;本文目录&#x1f959;一…

C++课堂整理--第二章内容

提前声明&#xff1a; 本文内容为华北水利水电大学研究生C课程&#xff0c;如有 侵权请告知&#xff0c;作者会予以删除 1程序控制结构 语句是程序的基本语法成分。程序设计语言的语句按功能可以分成三类&#xff1a;声明语句 指示编译器分配内存&#xff0c;或者提供程序…

Windows服务器配置证书

以windows server 2012为列 1.打开服务器管理器 2.添加角色和功能 3.点击下一步 4.继续下一步 5.继续下一步 6.选择证书服务 7.添加该功能 8.继续下一步 9.继续下一步 10.继续下一步 11.添加证书颁发机构和证书颁发机构web注册 &#xff0c;然后点击下一步 12.点击安装 13.再次…

Linux|centos二进制方式安装系统和网络监控神器prometheus+grafana(装逼神器它来了)

Prometheus简单介绍&#xff1a; Prometheus使用Go语言开发&#xff0c;是Google BorgMon监控系统的开源版本&#xff0c;怎么产生的就不在这讨论了&#xff0c;反正就是香&#xff0c;简单易用。 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing F…

apache-atlas-hive-hook-源码分析

Atlas Hook类图 Hive 元数据变更有2种实现&#xff1a; 1)基于 Hook 函数实现&#xff0c;实现类为 HiveHook 2)基于MetaStoreEventListener 实现&#xff0c; 实现类为HiveMetastoreHookImpl 所以提供2 种配置&#xff0c;即配置钩子函数或监听器&#xff0c;我们目前采用的是…