当前位置: 首页 > news >正文

原生 JavaScript 封装 JSONP 跨域请求

在 Web 开发中,跨域资源共享(CORS)是一个常见的问题。由于安全原因,浏览器限制了从一个源加载的脚本与另一个源的资源进行交互。JSONP(JSON with Padding)是一种早期用来解决跨域问题的技术。本文将介绍如何使用原生 JavaScript 封装 JSONP 跨域请求。

什么是 JSONP?

JSONP 是一种利用 <script> 标签获取跨域数据的技巧。由于 <script> 标签的加载不受同源策略的限制,因此可以通过动态创建 <script> 标签的方式来请求跨域数据。

JSONP 的工作原理

  1. 前端页面动态创建一个 <script> 标签,并将其 src 属性设置为跨域请求的 URL。
  2. 该 URL 包含一个查询参数,通常是 callback,其值是一个函数名。
  3. 服务器接收到请求后,将数据包裹在函数调用中,然后返回给前端。
  4. 前端定义的函数接收到数据后,可以立即处理这些数据。

封装 JSONP 请求

以下是一个简单的 JSONP 请求封装示例:

function jsonp(url, callback) {// 定义回调函数的名称const callbackName = `jsonp_callback_${Date.now()}`;// 将回调函数存储在 window 对象上window[callbackName] = function(data) {// 执行回调函数,并将数据作为参数传入callback(data);// 移除 script 标签document.body.removeChild(script);// 删除 window 上的回调函数delete window[callbackName];};// 创建 script 标签const script = document.createElement('script');script.src = `${url}?callback=${callbackName}`;document.body.appendChild(script);
}// 使用示例
jsonp('https://example.com/api/data', function(data) {console.log(data);
});

注意事项

  1. 安全性:由于 JSONP 可以被任何域调用,因此存在安全风险。确保你请求的域是可信的。
  2. 错误处理:JSONP 不支持原生的错误处理,需要通过其他方式(如超时机制)来处理错误。
  3. HTTP 方法:JSONP 通常只支持 GET 请求,因为它依赖于 URL 查询参数。
  4. 数据格式:服务器返回的数据必须是有效的 JSON 格式,并且需要被包裹在函数调用中。

结论

虽然现代的跨域解决方案(如 CORS)更为安全和强大,但在一些特定场景下,JSONP 仍然是一种有效的跨域数据获取方法。通过封装 JSONP 请求,我们可以在不使用额外库的情况下实现跨域数据交互。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【系统架构设计师-2021年真题】案例分析-答案及详解
  • [羊城杯 2020]Blackcat1
  • Cross-Encoder实现文本匹配(重排序模型)
  • 数据库DDL语句
  • linux驱动开发-ioctl
  • 基于 onsemi NCV78343 NCV78964的汽车矩阵式大灯方案
  • scroll-behavior属性与页面平滑滚动
  • 论文翻译:arxiv-2022 Ignore Previous Prompt: Attack Techniques For Language Models
  • Redis——通用命令
  • 探索广东省自闭症寄宿学校的独特教育模式
  • Python编程 - 三器一包
  • 使用Python实现多个PDF文件的合并
  • free 命令:显示内存使用情况
  • 电脑怎么录屏?四款录屏工具分享
  • yum下载软件失败:‘Could not resolve host: mirrorlist .centos .org; Unknowm error
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java|序列化异常StreamCorruptedException的解决方法
  • linux安装openssl、swoole等扩展的具体步骤
  • select2 取值 遍历 设置默认值
  • spring security oauth2 password授权模式
  • WebSocket使用
  • yii2权限控制rbac之rule详细讲解
  • 阿里云前端周刊 - 第 26 期
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 数组的操作
  • 责任链模式的两种实现
  • 找一份好的前端工作,起点很重要
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #Ubuntu(修改root信息)
  • $$$$GB2312-80区位编码表$$$$
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (笔试题)合法字符串
  • (纯JS)图片裁剪
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)linux下的时间函数使用
  • (转)程序员疫苗:代码注入
  • (转)甲方乙方——赵民谈找工作
  • (转)原始图像数据和PDF中的图像数据