JavaScript学习 -- jsonp跨域请求

简介: JavaScript学习 -- jsonp跨域请求

在现代 Web 应用程序的开发中,由于跨域访问的限制,经常需要在不同的域之间传输 JSON 数据。但是,浏览器强制遵循同源策略,限制了浏览器从一个域向另一个域请求数据的能力。为此,我们可以使用 JSONP(JSON with Padding)技术,它通过动态创建 script 标签实现了跨域传输 JSON 数据。

JSONP 实现了一个简单但非正式的协议,在客户端发出一个 GET 请求时,服务端返回一些 JavaScript 代码,使客户端能够利用这些代码执行回调。JSONP 非常适合用于构建跨域的 JSON 数据请求,但不能用于 POST 请求等其他类型的 Ajax 请求。本文将介绍如何在JavaScript中使用JSONP,并提供一个实际的例子。

实现JSONP

JSONP 可以通过以下代码实现:

function jsonp(url, callbackName, callback) {
  const script = document.createElement('script');
  script.src = `${url}?callback=${callbackName}`;
  window[callbackName] = (data) => {
    callback(data);
    document.body.removeChild(script);
  };
  document.body.appendChild(script);
}

我们可以看到,这个函数有三个参数:

  • url: JSONP 数据请求的 URL。
  • callbackName: 在服务端接受回调函数名的参数名。
  • callback: 接收 JSONP 数据的回调函数。

这个函数会动态地创建一个新的 script 标签,为获取 JSONP 数据请求 URL 添加一个查询参数 callback=callbackName。回调函数的名字将保留在查询参数中,以便服务端能够读取。

然后,在全局命名空间中,我们暴露这个名为 callbackName 的回调函数,并在脚本标签的 load 事件处理函数上执行这个函数。核心代码如下:

window[callbackName] = (data) => {
    callback(data);
    document.body.removeChild(script);
};

最后,我们再将新创建的 script 标签添加到文档中。因为该代码是通过 <script> 标签上定义的回调函数来执行的,所以这个 JSONP 请求的响应将被直接注入到我们的 JavaScript 中。

完整的代码如下:

function jsonp(url, callbackName, callback) {
  const script = document.createElement('script');
  script.src = `${url}?callback=${callbackName}`;
  window[callbackName] = (data) => {
    callback(data);
    document.body.removeChild(script);
  };
  document.body.appendChild(script);
}
jsonp('https://api.github.com/users/octocat', 'myCallback', (data) => {
  console.log(data);
});

在这个例子中,我们向 GitHub API 发送了一个 JSONP 请求,当响应返回时,在控制台打印响应数据。此外,我们利用服务端接受 callback=myCallback 参数,来创建了用于响应数据的回调函数。

JSONP 的优缺点

JSONP 的优点:

  • 浏览器支持良好,能在绝大多数环境下正常使用。
  • 不需要 Ajax 请求,无需 XMLHttpRequest 对象,不需要进行跨域 AJAX 的额外工作。

JSONP 的缺点:

  • 安全性问题。由于是在全局作用域上执行代码,所以恶意攻击者可以通过 JSONP 某些特定的接口来进行 CSRF(跨站请求伪造)。因此,我们需要在服务端进行一些针对性的安全策略。
  • 只支持 GET 请求,不能支持 POST 等其他类型的 AJAX 请求。
  • 只支持文本请求,不能传输二进制图像、JSON、XML 等类型的文件。

总结

JSONP 是一个使用非常广泛的跨域请求技术。通过简单的回调的方式,能方便地实现从不同域名的服务端动态地获得 JSON 数据。虽然使用起来比较方便,但也存在某些限制。JSONP 体现了一种传统 JavaScript 方式,如果不需要传输敏感数据或处理安全要求比较高的场景,我们仍然可以使用此技术。

目录
相关文章
|
28天前
|
JavaScript
ES6学习(9)js中的new实现
ES6学习(9)js中的new实现
|
5天前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
6天前
|
JavaScript 前端开发 API
紧跟月影大佬的步伐,一起来学习如何写好JS(上)
该文章跟随月影老师的指导,探讨了编写优质JavaScript代码的三大原则:各司其职、组件封装与过程抽象,通过具体示例讲解了如何在实际开发中应用这些原则以提高代码质量和可维护性。
紧跟月影大佬的步伐,一起来学习如何写好JS(上)
|
4天前
|
JavaScript 前端开发 Oracle
软件工程师,学习下JavaScript ES6新特性吧
软件工程师,学习下JavaScript ES6新特性吧
24 9
|
5天前
|
JavaScript 前端开发 算法
紧跟月影大佬的步伐,一起来学习如何写好JS(下)
该文章延续了上篇的内容,进一步探讨了编写优秀JavaScript代码的实践,强调了代码风格一致性、性能优化、团队约定的重要性,并通过实际案例分析了如何在不同场景下写出合适的代码。
|
2月前
|
JSON 前端开发 JavaScript
|
21天前
|
存储 JSON JavaScript
学习node.js十三,文件的上传于下载
学习node.js十三,文件的上传于下载
|
2月前
|
JavaScript 前端开发 iOS开发
学习强大的JavaScript一行代码,能够节省你的时间和代码量
这段内容介绍了25个实用的JavaScript一行代码技巧,涵盖复制内容到剪贴板、打乱数组、颜色值转换、计算平均值、检查数字奇偶性、数组去重、对象为空检测、字符串反转、日期计算、首字母大写、生成随机字符串、四舍五入、清除Cookie、检测暗黑模式等,帮助开发者提高效率并简化代码。
26 2
|
2月前
|
JavaScript 前端开发 小程序
基于js开发快速学习鸿蒙基础
【8月更文挑战第26天】
39 1
|
2月前
|
移动开发 JavaScript 前端开发
如何使用 JavaScript 进行跨域请求?
如何使用 JavaScript 进行跨域请求?