1. 什么是JSONP请求?
在浏览器中会存在有同源策略机制,不是同源的网站想要实现资源的交互可以通过<script src=””></script>标签来实现函数的调用,从而实现数据的交互。如图1.1所示, 使用scipt标签getdata.js调用了html文件中的abc函数,并传递了一个对象数据。
由此可以联想到,如果把getdata.js文件部署到了服务器上,就使用script标签实现不同源网站的数据资源交互。而JSONP请求,就是基于script标签实现的跨域请求。
2. 使用Ajax实现JSONP请求,Ajax都做了什么?
1)自动生成了并携带一个callback=jQueryxxx的参数,如图2.1所示,jQueryxxx是一个随机生成的一个回调函数(当客户端收到服务器发送回来的调用信息会执行这个回调函数,并输出数据)。
/* -- 这是简单的运行在服务器上的jsonp接口 -- */
// 必须配置在cors中间件之前,配置JSONP的接口
app.get('/api/jsonp', (req, res) => {
//通过req.query获取客户端发送过来查询字符串对象,获取客户端使用jQuery发送过来的随机函数名
const funcName = req.query.callback
console.log(funcName);
const data = { name: 'helulu', age: 22 }
// 获取把函数名和参数封装成字符串的形式
const scriptStr = `${funcName}(${JSON.stringify(data)})`
// 把函数和参数发送给客户端,客户端调用jQuery自动封装的函数,打印出data对象数据
res.send(scriptStr)
})
2)Ajax还提供了更改函数名和更改默认值callback的方法如图2.2所示
3. Ajax发起JSONP请求过程总结
服务端:
/* -- 服务器端代码 --*/
const express = require('express')
const app = express()
// 必须配置在cors中间件之前,配置JSONP的接口
app.get('/api/jsonp', (req, res) => {
//通过req.query获取客户端发送过来查询字符串对象,获取客户端使用jQuery发送过来的随机函数名
const funcName = req.query.callback
console.log(funcName);
const data = { name: 'helulu', age: 22 }
// 获取把函数名和参数封装成字符串的形式
const scriptStr = `${funcName}(${JSON.stringify(data)})`
// 把函数和参数发送给客户端,客户端调用jQuery自动封装的函数,打印出data对象数据
res.send(scriptStr)
})
app.use('/api', router)
app.listen(80, () => {
console.log('the server is running at http://127.0.0.1')
})
客户端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
//导入在线jQuery文档
<script src="https://cdn.staticfile.org/jquery/3.6.2/jquery.min.js"></script>
<body>
<button id="btnjsonp">JSONP</button>
<script>
$('#btnjsonp').on('click', function () {
$.ajax({
method:'GET',
dataType: 'jsonp',
url: 'http://127.0.0.1/api/jsonp',
// jsonp:'callbook',
// jsonpCallback:'abc',
success: function (res) {
console.log(res);
}
})
})
})
</script>
</body>
</html>
原文地址:https://blog.csdn.net/qq_43808342/article/details/128362842
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_15585.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。