最近在学习next.js时在文档发现这样一段话,发现自己对于3xx状态码一直没搞明白,趁着这次机会实践一波。
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
- 那么对于post请求呢,如果我们将test301和tttt的请求方法改为post,并在body中附带一些值能否保留到第二请求呢?实验结果如下:
实验结果:浏览器在第二次请求时并没有使用post方法,仍然使用了get方法!
308状态码
308装态码的效果其实和301类似,均代表永久重定向,但不同的是,308状态码并不会改变请求方法类型,并且可以保留原请求体的内容,如下图:
302状态码、303状态码、307状态码
理解了301以及308状态码后,302、303以及307状态码其实类似,这三者均代表临时重定向,而302以及303一样,重定向后的请求会使用get请求,而307与308的行为一致,不会改变请求的方法类型和请求体内容。
304状态码
304状态码常用协商缓存失效后,将资源标识符和最后修改时间发送给服务器,检测是否失效,如果未失效则使用浏览器缓存,并返回304状态码。此处,我们在请求头中添加cache-control:max-age=10,在10秒内再次请求都将从缓存中读取,十秒之后则进行协商缓存,如图: