前言:作为一个8年的大龄码农,带过了不少新人,发现很多前端人总是觉得写后端很难,还没开始学习,心里就犯嘀咕,其实,后端和前端的开发中间就只隔着一个《HTTP协议》。本文将通过前端的知识来阐述一些后端常见的开发场景,旨在消除前端人在进入后端领域开发前的心理屏障。
一、什么是后端开发
其实后端开发入门很简单,可以把它整体当作成一个函数,函数的入参是请求报文,返回值为响应报文。
后端开发公式:response = f(request)
公式因子说明:
- request:请求报文
- response :响应报文
- f:处理参数(请求报文)并返回处理结果 (响应报文)
f就是做后端开发的内容,包括但不限制于:
function doBackend(request,response){
// 解析request:参数JSON话,参数加解密
// 权限管理:RBAC等
// 远程调用(服务端之间通信):http协议、TCP/UDP、RPC(在TCP/UDP的基础上实现的)、参数加密等
// 数据持久化:数据库curd;
// 拼接response
response.send('xxx') // 返回内容
response.end()
}
二、HTTP协议简单说明
其实,这个函数是建立在HTTP协议上,我们写服务器开发前,是需要有HTTP协议的基础知识。下面,我将简单的介绍一些基础的HTTP协议。
2.1.1 URL组成
调用后端接口是要通过请求地址(即URL)来访问的,那么我们详细的来认识URL。
一个完整的URL包括:协议部分、域名部分、端口部分、虚拟目录部分、文件名部分、参数部分、锚部分
更加详细说明:developer.mozilla.org/zh-CN/docs/…
2.1.2 请求报文
主要包含url信息和请求数据,组成:起始行 + 首部(header 头)+ 数据主体(get请求没有)
<method> <request-URL> <version>
<header>
<entity-body>
浏览器打开掘金首页:juejin.cn/ ,通过抓包工具(Fiddler、whislte),查看请求报文如下:
2.1.3 响应报文
主要包含:响应码(告知请求是否成功)和返回数据, 组成:起始行 + 首部(header 头)+ 数据主体
<version> <status> <reason-phrase>
<header>
<entity-body>
浏览器打开掘金首页:juejin.cn/ ,通过抓包工具(Fiddler、whislte),查看响应报文如下:
HTTP协议更加详细的学习,《HTTP协议权威指南》
三、后端常见开发场景
本章节内容将基于前面介绍的HTTP协议来实现一下后端常见的开发场景。在开始之前,我先将第一个部分和第二部分的内容做一个归纳。
后端开发范式:
接下,将使用NodeJS的http模块来实现一下简单场景,
3.1 解析请求报文和拼接响应报文
请求地址:http://127.0.0.1:1000/param1=11
const http = require('http')
const server = http.createServer((request, response) => {
/**解析请求报文 */
const headers = []
request.rawHeaders.forEach((key, index) => {
if (index % 2 === 0) {
headers.push(`${key}:${request.rawHeaders[index + 1]}`)
}
});
/**处理响应报文 */
response.setHeader('Content-Type', ' text/html') // 设置响应头,告诉浏览器返回数据主体是html类型
// 拼接响应数据主体
response.write(`
<html>
<head>
<meta charset="utf-8" />
<title>hello world</title>
</head>
<body>
hello world
<br><br>
起始行<br>${request.method} ${request.url} ${request.httpVersion}<br><br>
请求头<br>${headers.join('<br>')}
</body >
</html > `
)
response.end()
})
server.listen(1000)
3.2 重定向跳转
重定向的响应报文需告知浏览器响应码为302,并设置Location响应头,
具体实现如下:
const http = require('http')
const server = http.createServer((request, response) => {
// 设置响应码 302 或者301
response.statusCode = 302
// 设置响应头,告诉浏览器要跳转的地址
response.setHeader('Location', 'https://juejin.cn/')
response.end()
})
server.listen(1000)
3.3 设置Cookie
浏览器设置Cookie,是通过查看响应报文是否存在Set-Cookie请求头,存在不指定时间未过期,浏览器就会种上该字段的Cookie
具体实现如下:
const http = require('http')
const server = http.createServer((request, response) => {
/** 设置cookie,制定cookie
** 字段名为SSID,
** 有效期:Wed, 13-Jan-2023 22:23:01 GMT
** 生效目录:/d
** 并设置为httpOnly
*/
response.setHeader('Set-Cookie', [
`SSID=Ap4GTEq; Expires=Wed, 13-Jan-2023 22:23:01 GMT;Path=/d;HttpOnly;`
])
// 拼接响应数据主体
response.write(`hello world`)
response.end()
})
server.listen(1000)
主要请求路径要带上/d,才能在浏览器上看到对应的cookie:http://127.0.0.1:1000/d
3.4 数据库操作
实现从数据库查询id=1的用户信息,其实操作的是数据库,主要是以SQL,学习一下就行了,不难哈
接口协议:GET /user?id=1
请求地址:http://127.0.0.1:1000/user?id=1
const http = require('http')
const { URL } = require('url')
const server = http.createServer((request, response) => {
// 解析参数
const urlObj = new URL(`http://${request.headers.host}${request.url}`)
const userId = urlObj.searchParams.get('id')
// 到数据库的User表查找id=1的记录
const userInfo = findUser(userId)
// 设置返回数据主体为JSON格式
response.setHeader('Content-Type', 'application/json; charset=utf-8')
response.write(JSON.stringify({
code: 0,
data: userInfo,
msg: 'success'
}))
response.end()
})
function findUser(userId) {
// 简写
return {
id: userId,
name: 'azuo',
age: 8
}
}
server.listen(1000)
四、总结
后端开发其实就是围绕HTTP协议来进行的,前端入门后端开发其实就隔着一个《HTTP协议》。