您现在的位置是:首页 >技术交流 >网络协议-全栈角度看HTTP协议(node.js)网站首页技术交流
网络协议-全栈角度看HTTP协议(node.js)
简介网络协议-全栈角度看HTTP协议(node.js)
目录
Method和解析Body
解析Body和2xx状态码
// npm install express --save
// 安装nodemon(node的热更新)
const express = require('express')
const app = express()
// 打招呼接口
app.get('/greetings', (req, response) => {
response.send('Hi!')
})
// fetch("/greetings")//模拟调用
//
app.post('/product', (req, res) => {
const contentType = req.headers['content-type']
let body = null
console.log(contentType)// 服务端打印
let requestText = ""
req.on('data', (buffer) => {// 接收客户端传给后端的流
// 8bit - byte(8进制字节流)
requestText += buffer.toString('utf-8')
// console.log(buffer.toString('utf-8').length) // gbk国标
})
req.on('end', () => {
console.log(requestText.length)
switch(contentType) {
case 'application/json' :
body = JSON.parse(requestText)
res.set('Content-Type','application/json')
res.status(201).send(JSON.stringify({success:true}))
break
}
})
})
// fetch('/product', {method: 'POST',headers:{'content-type':'application/json'} body:JSON.stringify({name:'apple'.padStart(1000000, 'A')})})
app.put('/product:id', (req, res) => {
console.log(req.params.id)
res.sendStatus(204)
})
// fetch('/product/123', {method: 'PUT'})
app.delete('/product:id', (req, res) => {
console.log(req.params.id)
res.sendStatus(204)
})
// fetch('/product/123', {method: 'DELETE'})
app.listen(3000, () => {})
调整Header和3xx状态码
实战-重定向观察
观察下列重定向行为的区别(主要涉及爬虫,SEO优化)
- 301
- 302
- 303
- 307
- 308
const express = require('express')
const app = express()
app.get('/301', (req, res) => { // 永久更新,会被记住,下次调也会跳到/def,哪怕你没有起这个服务
res.redirect(301, '/def')// 接口重定向,目前浏览器会进行跳转重定向
})
app.get('/302', (req, res) => {
res.redirect(302, '/def')// 接口重定向,目前浏览器会进行跳转重定向
})
app.post('/303', (req, res) => {
res.redirect(303, '/def')// 接口重定向,目前浏览器会进行跳转重定向
})
// fetch('/303', method: "POST")
app.post('/302', (req, res) => {
res.redirect(302, '/def')// 接口重定向,目前浏览器会进行跳转重定向
})
// 301,302,303可以post过去,get回来
// 307不能post过去get回来,得post过去,post回来
app.get('/303', (req, res) => {
res.redirect(303, '/def')// 接口重定向,目前浏览器会进行跳转重定向
})
app.get('/def', (req, res) => {
res.send('This is def(GET)')
})
app.listen(3000, () => {})
错误处理4xx和5xx
实战-错误处理
为下列场景返回不同的错误码
- 用户没有登录401
- 服务器报错500
- 内容没有找到404
- 不支持POST方法405
const express = require('express')
const app = express()
app.get('bc', (req, res) => {
res.sendStatus(401)
// res.sendStatus(403)
// res.sendStatus(404)
// res.sendStatus(405)
// throw "Error" // 500
})
app.get('/def', (req, res) => {
res.send('This is def(GET)')
})
app.listen(3000, () => {})
小结:
Body解析过程中协商技巧很有用
switch(contentType) {
case ''
break
}
认真对待3xx状态码
反向代理,负载均衡
错误处理遵循HTTP协议
网关,负载均衡
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。