Express书写使用CORS与JSONP跨域的接口

我们之前了解过了JSONP跨域的问题,所以我们在这里不做解释

JSONP文章链接:同源与JSONP跨域请求—如何实现节流防抖_Developer小蜗的博客-CSDN博客


目录

一.CORS

1.了解CORS

2.响应头

1.Access-Control-Allow-Origin

2.Access-Control-Allow-Headers

3.Access-Control-Allow-Methods

二.CORS请求分类

1.简单请求

2.预检请求

三.编写CORS与JSONP接口 

1.CORS跨域接口

 2.JSONP跨域接口

3.编写接口 文件

 4.自定义路由模块


一.CORS

1.了解CORS

(cross-Origin Resource Sharing)跨资源共享

在express包里的cors跨域是非常简单的,我们先来了解一下CORS跨域

CORS由一系列HTTP响应头组成,这些响应头非常的重要,它们决定了浏览器是否阻止前端JS跨域获取资源,浏览器的同源策略会默认的阻止资源跨域响应、客户端获取资源,但是如果我们在接口服务器中配置了CORS相关的HTTP响应头的话,就可以解除浏览器的跨域访问限制,它在服务端进行配置,只要客户端的浏览器支持XMLHttpRequest Level2,我们就可以正常的访问服务器接口了

2.响应头

那么CORS有哪些响应头呢?

1.Access-Control-Allow-Origin

 如果我们在响应头部携带Access-Control-Allow-Origin字段:

res.setHeader('Access-Control-Allow-Origin','http://xxxxxx.com')
//只允许来自http://xxxxxx.com的请求
res.setHeader('Access-Control-Allow-Origin','*')
//允许来自任何域的请求

2.Access-Control-Allow-Headers

如果我们向服务器发送了额外的请求头信息,那么我们就需要在服务器端通过 Access-Control-Allow-Headers对额外的请求头进行声明,否则这次的请求会失败:

res.setHeader('Access-Control-Allow-Header','Content-Type,X-Castom-Header')
//允许客户端额外向服务器发送Content-Type和X-Castom-Header请求头

额外的?那么就一定会有"不额外的"(一共九个),默认情况下,CORS只支持客户端向服务器发送这9个请求头:

Accept        Accept-Language        Content-Language        DPR        Downlink        Save-Data        Viewport-width        width        Content-Type


值仅限于text/plain,multipart/form-data,application/x-www-form-urlencoded三者之一

3.Access-Control-Allow-Methods

如果我们希望通过PUT、DELETE等方式请求服务器资源,那我们就需要通过 Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法:

res.setHeader('Access-Control-Allow-Methods','GET,POST,DELETE')
//只允许所GET、POST、DELETE请求方法
res.setHeader('Access-Control-Allow-Methods','*')
//允许所有HTTP请求方法

因为默认情况下,CORS只支持客户端发起GET、POST、HEAD这三种请求方式,所以我们需要用次响应头来设置允许使用的HTTP方法


二.CORS请求分类

客户端在请求CORS接口的时候,根据不同的请求方式和请求头,可以将CORS请求分为俩类:

1.简单请求

简单请求有俩个条件,只要满足了这三个条件的话,就是一个简单请求:

1.请求方式必须为GET、POST、HEAD这三者之一

2.HTTP头部信息字段不是自定义的

3.HTTP头部信息字段在那9中之内

tips:简单请求中客户端与服务器之间只会发生一次请求 

2.预检请求

预检请求只要满足一下一个,就是一个预检请求:

1.请求方式为GET、POST、HEAD这三者之外的请求Methods类型

2.请求头部中包含自定义头部字段

3.向服务器发送application/json格式的数据

tips:客户端与服务器之间会发生俩次请求,OPTION预检请求成功之后,才会发起真正的请求 

意思就是在浏览器与服务器之间正式通信前,浏览器会先发送OPTION请求来进行预检,以获取服务器是否允许该实际请求, 所以它才会发起俩次请求,服务器成功响应预检请求之后,才会真正发送真正的请求并获取真实的数据


三.编写CORS与JSONP接口 

1.CORS跨域接口

EXpress以及为我们提供好了cors中间件来解决跨域的问题:

cors是Express的第三方中间件,需要我们去安装配置一下:

npm i cors

 导入之后,我们在路由前调用cors中间件就可以使用了,很方便快捷的解决了跨域的问题

服务器实例.use(cors())

 编写接口步骤:

创建一个基本服务器=>创建API路由模块=>编写GET接口=>编写POST接口=>CORS跨域资源共享

 2.JSONP跨域接口

本文章顶部有JSONP的阐述博客,这里只做一点注意事项:

如果项目中以及配置了CORS跨域资源共享,为了防止冲突,必须在配置CORS中间件之前声明一个JSONP接口,否则的话JSONP接口会被当做CORS接口来处理,起不到JSONP的作用 

3.编写接口 文件

const express = require('express')
//cors中间件解决跨域
const cors = require('cors')
const router = require('./apiRouter')

const app = express()

//在配置cors前配置jsonp
app.get('/api/jsonp',(req,res)=>{
    const data = {
        username:"小蜗",
        age:22
    }
    const callStr = `${JSON.stringify(data)}`
    res.send(callStr)
})

//在所有路由前调用配置cors中间件
app.use(cors())
//在路由前调用解析url-encoded
app.use(express.urlencoded({extended:false}))
app.use('/api',router)

app.listen(3000,()=>{
    console.log("已开启服务器在http://127.0.0.1:3000")
})

 4.自定义路由模块

const express = require('express')

const router = express.Router()

//GET
router.get('/get',(req,res)=>{
    const query = req.query
    res.send({
        status:0,    //0表示成功,1表示失败
        msg:"GET请求成功",   //描述
        data:query
    })
})
//POST
router.post('/post',(req,res)=>{
    const body = req.body

    res.send({
        status:0,
        msg:"POST请求成功",
        data:body
    })
})

module.exports = router

猜你喜欢

转载自blog.csdn.net/weixin_63836026/article/details/124040893