1-16 预检请求与JSONP接口

85 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

预检请求

CORS请求的分类
客户端在请求CORS借口时,根据请求方式和请求头的不同,可以讲CORS的请求分为两大类,分别是:

  1. 简单请求

同时满足以下两大条件的请求,就属于简单请求:
(1)请求方式:GET、POST、HEAD三者之一
(2)HTTP头部信息不超过以下几种字段:
无自定义头部字段、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width、Content-Type(只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)

  1. 预检请求 只要符合以下任何一个条件的请求,都需要进行预检请求:\

请求方式为GET、POST、HEAD、之外的请求Method类型
请求头中包含自定义头部字段\ 向服务器发送了application/json格式的数据
在浏览器与服务器正式通信之前,浏览器会先发送OPTION请求进行预检,以获知服务器是否允许该实际请求,所以这一次的OPTION请求成为“预检请求”。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。

回顾JSONP的概念与特点

概念:浏览器通过

特点

  1. JSONP不属于真正的Ajax请求,因为它没有使用XMLHttpRequest这个对象。
  2. JSONP仅支持GET请求,不支持POST、PUT、DELETE等请求。

创建JSONP接口的注意事项
如果项目中已经配置了CORS跨域资源共享,为了防止冲突,必须在配置CORS中间件之前声明JSONP的接口。否则JSONP接口会被处理成开启了CORS的接口。

实现JSONP接口的步骤

  1. 获取客户端发送过来的回调函数的名字
  2. 得到要通过JSONP形式发送给客户端的数据
  3. 根据前两部得到的数据,拼接出一个函数调用的字符串。
  4. 把上一步拼接得到的字符串,响应给客户端的

//必须在配置cors之前配置JSONP
app.get('/api/jsonp',(req,res)=>{
//得到函数的名称
const funcname = req.query.callback
 const data = {
    name:'zs',
    age:22
}
const scriptStr = `${funcname}(${JSON.stringify(data)})`

res.send(scriptStr)
})