1.JSONP的实现原理。
浏览器通过<script>标签的src属性,请求服务器的数据,同时,服务器返回一个函数的调用。
特点:
JSONP
不属于真正的Ajax
请求,因为它没有使用XMLHttpRequest
这个对象JSONP
仅支持GET
请求,不支持POST
、PUT
、DELETE
等请求
2.创建JSONP接口。
注意事项:
如果项目中已经配置了CORS跨域资源共享,为了防止冲突,必须在配置CORS中间件之前声明JSONP的接口,否则JSONP接口会被处理成开起了CORS接口。
1.准备工作:
- 创建一个app.js文件 一个api文件夹 ,api文件夹下创建一个apiRouter.js文件,创建一个index.html文件
- 运行npm i express ,安装express模块
- 运行npm i cprs 命令,安装
mysql
模块
2.实现步骤分析:
- 获取客户端发送过来的回调函数的名字
- 得到要通过
JSONP
形式发送给客户端的数据 - 根据前两步得到的数据,拼接出一个函数调用的字符串
- 把上一步拼接得到的字符串,响应给客户端的
<script>
标签进行解析执行
代码:
// 导入 express 模块
const express=require('express')
// 创建 express 的服务器实例
const app.express()
// 配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))
// 必须在配置 cors 中间件之前,配置 JSONP 的接口
app.get('/api/jsonp',(req,res)=>{
//定义JSONP接口的具体实现过程
// 1. 得到函数的名称
const funcName=req.query.callback;
// 2. 定义要发送到客户端的数据对象
const data={name:'sjj',age:18}
// 3. 拼接处一个函数的调用
const scriptStr = `${funcName}(${JSON.stringify(data)})`
// 4. 把拼接的字符串,响应给客户端
res.send(scriptStr)
})const cors=require('cors')
app.use(cors())const router=require('./apiRouter')
// 把路由模块,注册到 app 上
app.user('/api',router)// 调用 app.listen 方法,指定端口号并启动 web 服务器
app.listen(8080,()=>{
console.log('running……')
})
3.在网页中使用 jQuery 发起 JSONP 请求
调用 $.ajax() 函数,提供 JSONP 的配置选项,从而发起 JSONP 请求
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
</head><body><script>$(function () {$.ajax({method: 'GET',url: 'http://127.0.0.1:8080/api/jsonp',dataType: 'jsonp',success: function (res) {console.log(res)}})})</script>
</body></html>