JSONP:非官方的跨域解决方案,纯粹依靠程序员的聪明才智,只支持get请求
JSONP是怎么工作的:再页面中有一些标签天生具有跨域能力,就像是link,img,iframe,script
JSONP就是利用script标签的跨域能力来发送请求
如下所示:是跨域请求:源是file协议 路径是本地地址 目的是:http协议 域名和路径都他他不一样
使用的是 script标签


使用 script标签(原理)
const data={name:'张三'
};
console.log(data)
Document
使用file协议发起请求:这时候script请求的js也是file协议的

使用http协议访问 这时候访问的资源app遵循的也是http协议


这时候使用此http协议的url网址:代替原先的路径
Document
js部分
const data={name:'张tt三'
};handle(data)
这时候使用本地资源打开此页面,访问成功:也就是使用file协议 使用script标签 访问的资源是http协议:跨域成功(实现了script跨域实现跨域)
返回的数据是数据和函数调用,script标签做解析处理,然后在html页面显示

script发送跨域请求,返回的结果是函数调用的内容==js代码,这样才可以被前端引擎解析使用
服务器端
const { json } = require('express');
const express=require('express')const app=express();
app.get('/home',function(requset,response){//设置响应头 名称 值----设置允许跨域// response.setHeader('Access-Control-Allow-Origin','*');//设置响应体response.sendFile(__dirname+'/同源策略.html');//绝对路径
})
app.get('/data',function(requset,response){//设置响应头 名称 值----设置允许跨域// response.setHeader('Access-Control-Allow-Origin','*');//设置响应体response.send('用户数据');//绝对路径
})
app.get('/jsonp',function(requset,response) {response.send('console.log("jsonp")');})
app.listen(9000,()=>{console.log('9000启动成功')
})
html端:
Document
如果返回的不是js语句体,就会出错(因为使用script标签发起请求,js引擎无法解析非js代码)
服务器如果返回script的结果是 函数调用结果(js代码)


app.get('/jsonp',function(requset,response) {const data={name:'张三啊'};//将数据转化为字符串let str=JSON.stringify(data);//返回结果 不可以是数据 j代码 end防止添加不知名的响应头//``模板字符串 方便拼接response.end(`handle(${str})`)})
返回结果是函数调用,函数的参数就是想给客户端的结果数据
