Go-HTTP框架设计实现概述| 豆包MarsCode AI 刷题

63 阅读2分钟

1.再谈HTTP协议

第一个大规模使用:HTTP0.9 三十多年了

HTTP:超文本传输协议(Hypertext Transfer Protocal)

为什么是超文本:因为图片、音乐、视频是文本的扩充

为什么需要协议:约定俗称的规则(像说话)有边界

虽然 HTTP 和 HTTPS 在名称上非常相似,但它们在安全性上有本质的区别:HTTPS通过使用SSL/TLS协议,为数据传输提供了加密和完整性校验,从而保护了用户的隐私和数据安全。随着网络安全意识的提高,越来越多的网站开始使用HTTPS来保护用户数据。

协议里有什么:

1.请求行/状态行

方法名 URL 协议版本/////////协议版本 状态码 状态码描述

1xx:信息类

2xx:成功

3xx:重定向

4xx:客户端错误

5xx:服务端错误

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。

HTTP 状态码的英文为 HTTP Status Code

下面是常见的 HTTP 状态码:

  • 1xx(信息性状态码) :表示接收的请求正在处理。
  • 2xx(成功状态码) :表示请求正常处理完毕。
  • 3xx(重定向状态码) :需要后续操作才能完成这一请求。
  • 4xx(客户端错误状态码) :表示请求包含语法错误或无法完成。
  • 5xx(服务器错误状态码) :服务器在处理请求的过程中发生了错误。
2.请求头/响应头
3.请求体/响应体

DEMO:

package main

import (
	"context"
	"code.byted.org/middleware/hertz/pkg/app"
	"code.byted.org/middleware/hertz/pkg/server"

)
func main() {
	h := server.New()
	h.POST("/sis", func(c context.Context, ctx *app.requestContext) {//post方法 url 为/sis
		ctx.Data(200, "text/plain;charset=utf-8", []byte("ok"))//返回ok
	})
	h.Spin()
}

HTTP1:队头阻塞 传输效率低 明文

HTTP2:多路复用 头部压缩 二进制协议

QUIC:基于UDP 解决了队头阻塞 加密 快启动

应用层设计:提供合理的API:ctx.Body()而不是ctx.BodyA() 可理解、简单、冗余、兼容、可测、可见 中间件设计:洋葱模型 日志-Metrics-Biz Handler(为了配合Handler实现一个完整的请求处理生命周期 有预处理 有后处理 可以注册多中间件)

图片.png

路由设计

图片.png 协议层设计抽象出合适的接口 网络层设计:网络模型