文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何掌握JSONP

2024-04-02 19:55

关注

本篇内容主要讲解“如何掌握JSONP”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何掌握JSONP”吧!

 一个正常的请求: JSON

正常发请求时,curl 示例:

$ curl https://shanyue.tech/api/user?id=100  {   "id": 100,   "name": "shanyue",   "wechat": "xxxxx",   "phone": "183xxxxxxxx" }

使用 fetch 发送请求,示例:

const data = await fetch('https://shanyue.tech/api/user?id=100', {   headers: {     'content-type': 'application/json',   },   method: 'GET', }).then(res => res.json())

请求数据后,使用一个函数来处理数据

handleData(data)

一个 JSONP 请求

JSONP,全称 JSON with Padding,为了解决跨域的问题而出现。虽然它只能处理 GET 跨域,虽然现在基本上都使用 CORS  跨域,但仍然要知道它,毕竟面试会问。

curl 示例

$ curl https://shanyue.tech/api/user?id=100&callback=padding  padding({   "id": 100,   "name": "shanyue",   "wechat": "xxxxx",   "phone": "183xxxxxxxx" })

对于正常的请求有何不同一目了然: 多了一个 callback=padding, 并且响应数据被 padding 包围,这就是 JSONP

那请求数据后,如何处理数据呢?此时的 padding 就是处理数据的函数

window.padding = handleData

这里实现一个 jsonp 函数

function jsonp_simple ({ url, onData, params }) {   const script = document.createElement('script')    // 一、默认 callback 函数为 padding   script.src = `${url}?${stringify({ callback: 'padding', ...params })}`   // 二、使用 onData 作为 window.padding 函数,接收数据   window['padding'] = onData    document.body.appendChild(script) }

此时会有一个问题: window.padding 函数会污染全局,如果有多个请求发送如何处理?

使 jsonp 的回调函数名作为一个随机变量,代码如下

function jsonp ({ url, onData, params }) {   const script = document.createElement('script')    // 一、为了避免全局污染,使用一个随机函数名   const cbFnName = `JSONP_PADDING_${Math.random().toString().slice(2)}`   // 二、默认 callback 函数为 cbFnName   script.src = `${url}?${stringify({ callback: cbFnName, ...params })}`   // 三、使用 onData 作为 cbFnName 回调函数,接收数据   window[cbFnName] = onData;    document.body.appendChild(script) }  // 发送 JSONP 请求 jsonp({   url: 'http://localhost:10010',   params: { id: 10000 },   onData (data) {     console.log('Data:', data)   } })

代码附录

完整代码可见山月博客的 github 仓库:  https://github.com/shfshanyue/blog/tree/master/code/jsonp/

JSONP 实现完整代码:

function stringify (data) {   const pairs = Object.entries(data)   const qs = pairs.map(([k, v]) => {     let noValue = false     if (v === null || v === undefined || typeof v === 'object') {       noValue = true     }     return `${encodeURIComponent(k)}=${noValue ? '' : encodeURIComponent(v)}`   }).join('&')   return qs }  function jsonp ({ url, onData, params }) {   const script = document.createElement('script')    // 一、为了避免全局污染,使用一个随机函数名   const cbFnName = `JSONP_PADDING_${Math.random().toString().slice(2)}`   // 二、默认 callback 函数为 cbFnName   script.src = `${url}?${stringify({ callback: cbFnName, ...params })}`   // 三、使用 onData 作为 cbFnName 回调函数,接收数据   window[cbFnName] = onData;    document.body.appendChild(script) }

JSONP 服务端适配相关代码:

const http = require('http') const url = require('url') const qs = require('querystring')  const server = http.createServer((req, res) => {   const { pathname, query } = url.parse(req.url)   const params = qs.parse(query)    const data = { name: 'shanyue', id: params.id }    if (params.callback) {     str = `${params.callback}(${JSON.stringify(data)})`     res.end(str)   } else {     res.end()   }  })  server.listen(10010, () => console.log('Done'))

JSONP 页面调用相关代码

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title></title> </head> <body>   <script src="./index.js" type="text/javascript"></script>   <script type="text/javascript">   jsonp({     url: 'http://localhost:10010',     params: { id: 10000 },     onData (data) {       console.log('Data:', data)     }   })   </script> </body> </html>

JSONP 实现代码示例演示

从中克隆代码: 山月博客的 github 仓库

文件结构

快速演示

// 开启服务端 $ node server.js  // 对 demo.html 起一个服务,并且按照提示在浏览器中打开地址,应该是 http://localhost:5000 // 观察控制台输出 JSONP 的回调结果 $ serve .

到此,相信大家对“如何掌握JSONP”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯