带你了解3xx状态码

1,194 阅读2分钟

最近在学习next.js时在文档发现这样一段话,发现自己对于3xx状态码一直没搞明白,趁着这次机会实践一波。

image.png

301状态码

首先在next项目中发起一个请求

fetch('/api/test301', {
  method: 'get',
  headers: {
    "Content-Type": "application/json",
  },
  cache: 'no-store'
})
  • 这里我们先使用get请求,后续将改成post请求(这里要添加cache的配置,让next不要帮我们缓存接口返回值,否则后续的请求浏览器将直接从缓存中读取而不会重新发起,此问题仅出现在get请求中

    接下来在自己搭建的服务器中,为该请求设置返回301的状态码

app.get('/api/test301', (req, res) => {
  res.redirect(301, '/api/tttt')
})

app.get('/api/tttt', (req, res) => {
  res.send({
    code: 200,
    msg: '该用户信息已经录入',
    data: '该用户信息已经录入',
  })
})

最终浏览器的结果如下图所示,可以看到在301的状态码后方,标明此请求为永久性重定向,同时在响应头中将重定向的值一并返回给浏览器,浏览器随后直接发情另一个请求访问了 /api/tttt

image.png

  • 那么对于post请求呢,如果我们将test301和tttt的请求方法改为post,并在body中附带一些值能否保留到第二请求呢?实验结果如下:

image.png

实验结果:浏览器在第二次请求时并没有使用post方法,仍然使用了get方法!

308状态码

308装态码的效果其实和301类似,均代表永久重定向,但不同的是,308状态码并不会改变请求方法类型,并且可以保留原请求体的内容,如下图:

image.pngimage.png

image.pngimage.png

302状态码、303状态码、307状态码

理解了301以及308状态码后,302、303以及307状态码其实类似,这三者均代表临时重定向,而302以及303一样,重定向后的请求会使用get请求,而307与308的行为一致,不会改变请求的方法类型和请求体内容。

304状态码

304状态码常用协商缓存失效后,将资源标识符和最后修改时间发送给服务器,检测是否失效,如果未失效则使用浏览器缓存,并返回304状态码。此处,我们在请求头中添加cache-control:max-age=10,在10秒内再次请求都将从缓存中读取,十秒之后则进行协商缓存,如图:

image.png

image.png