走进HTTP协议 | 青训营笔记

64 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第 14 天 。

一、知识点介绍

本堂课主要讲http协议的概念以及http框架的设计与实现

二、详细知识点

1.HTTP协议

  • HTTP协议是什么
    • HTTP:超文本传输协议
  • 协议里面有什么
    • 请求行/状态行
      • 请求行:方法名+URL+协议版本
      • 状态行:协议版本+状态码+状态码描述
    • 请求头/响应头
      • 协议相关+业务相关的数据
    • 请求体/响应体
  • 分层设计
    • 应用层->传输层->网络层->数据链路层

HTTP请求

  • HTTP请求状态行:

    请求行由请求MethodURL 字段和HTTP Version三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本 HTTP协议的方法有: 

    • GET: 请求获取Request-URI所标识的资源
    • POST: 在Request-URI所标识的资源后增加新的数据 
    • HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
    • PUT: 请求服务器存储或修改一个资源,并用Request-URI作为其标识 
    • DELETE: 请求服务器删除Request-URI所标识的资源
    • TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断 
    • CONNECT: 保留将来使用
    • OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求
  • HTTP请求头

消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息

  • HTTP请求正文

只有在发送POST请求时才会有请求正文,GET方法并没有请求正文。

HTTP响应

HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。

  • HTTP响应状态行

状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:

  • HTTP响应状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 

  • 1xx指示信息 - 表示请求已接收,继续处理
  • 2xx成功 - 表示请求已被成功接收、理解、接受
  • 3xx重定向 - 要完成请求必须进行更进一步的操作
  • 4xx客户端错误 - 请求有语法错误或请求无法实现
  • 5xx服务器端错误 - 服务器未能实现合法的请求

常见状态代码、状态描述、说明:

  • 200: OK - 客户端请求成功
  • 400: Bad Request - 客户端请求有语法错误,不能被服务器所理解
  • 401: Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403: Forbidden - 服务器收到请求,但是拒绝提供服务
  • 404: Not Found - 请求资源不存在,eg:输入了错误的URL
  • 500: Internal Server Error - 服务器发生不可预期的错误
  • 503: Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

2.中间件设计

  • 实现预处理和后处理
func Middleware(some param){
    //预处理
    Next()
    //后处理
    ...
}
  • 中间件核心是保持中间件在任何场景下index保证递增
func (stx *RequestContext) Next() {
    ctx.index++
    for ctx.index < int8(len(ctx.handlers)) {
        ctx.handlers[ctx.index]()
        ctx.index++
    }
}
  • 出现异常想要停止则直接将当前索引设置为最大值跳出循环即可
func (ctx *RequestContext) Abort() {
    ctx.index = IndexMax
}

3.路由设计

image.png