本文档提供了 Go 中 HTTP 服务器和客户端实现的详细概述,位于 net/http 包内。它涵盖了处理 HTTP 请求和响应的架构、核心组件和工作流程,以及连接管理和配置选项。
该 net/http 包同时实现了功能丰富的 HTTP 客户端和服务器。这些组件可用于构建从简单的 API 客户端到功能齐全的 Web 服务器和框架的各种应用。有关操作系统和文件系统操作的信息,请参阅 操作系统和文件系统。
Go 标准库中的 HTTP 服务器和客户端遵循模块化设计模式,并具有明确定义的接口。这在保持易用性的同时,提供了高度的灵活性,并且具有合理的默认值。
来源
HTTP 服务器的实现围绕几个关键类型和接口展开,它们协同工作以接受连接、处理请求和发送响应。
Server 类型定义了运行 HTTP 服务器的参数。它负责接受新连接、为每个连接创建 goroutine 以及处理 HTTP 请求。
关键配置字段包括:
Addr:要监听的网络地址Handler:为每个请求调用的处理程序ReadTimeout/WriteTimeout:读取整个请求/响应的最大持续时间ReadHeaderTimeout:读取请求头允许的时间IdleTimeout:等待下一个请求的时间MaxHeaderBytes:请求头数据的最大大小来源
Handler 接口是服务器可扩展性的核心。它定义了响应 HTTP 请求的行为。
当收到请求时,服务器会将其传递给适当处理程序的 ServeHTTP 方法。处理程序负责生成响应。
来源
ResponseWriter 接口提供了构建 HTTP 响应的方法。
ResponseWriter 可能实现的额外接口:
Flusher:允许将缓冲的数据刷新到客户端Hijacker:允许接管底层连接CloseNotifier:通知客户端何时断开连接(已弃用,请使用 Request.Context)来源
ServeMux 是一个 HTTP 请求多路复用器(路由器),它将 URL 模式匹配到处理程序。它支持:
/files/image.jpg/files/example.com/files/POST /users//users/{id}来源
HTTP 请求流经服务器的流程:
来源
服务器提供了多个超时设置,以防止资源耗尽。
| 超时类型 | 描述 | 默认 |
|---|---|---|
| ReadTimeout | 读取请求(包括头和正文)的总时间 | 无(无超时) |
| ReadHeaderTimeout | 读取请求头的时间 | 无(无超时) |
| WriteTimeout | 写入响应的时间 | 无(无超时) |
| IdleTimeout | 在保持连接时等待下一个请求的时间 | 无(无超时) |
来源
HTTP 客户端实现旨在通过连接池高效地发起请求和处理响应。
Client 类型是发起 HTTP 请求的高级 API。它管理以下细节:
来源
Transport 类型实现了 RoundTripper 接口,负责 HTTP 请求的底层处理。
Transport 管理:
来源
客户端请求工作流程:
来源
Transport 管理具有各种配置选项的连接
| 配置 | 描述 | 默认 |
|---|---|---|
| MaxIdleConns | 所有主机之间的最大空闲连接数 | 100 |
| MaxIdleConnsPerHost | 每个主机之间的最大空闲连接数 | 2 |
| MaxConnsPerHost | 每个主机之间的最大总连接数 | 无限制 |
| IdleConnTimeout | 空闲连接保留时长 | 90 秒 |
| DisableKeepAlives | 禁用连接重用 | false |
| ResponseHeaderTimeout | 等待响应头的超时时间 | 无超时 |
| ExpectContinueTimeout | 等待 100-continue 的超时时间 | 1 秒 |
来源
客户端请求可以通过
Client.Timeout 的客户端级别超时Request.Context() 的每个请求上下文来控制来源
服务器和客户端共享几个关键数据结构以进行 HTTP 通信。
Request 类型表示服务器收到的或客户端将要发送的 HTTP 请求
来源
Response 类型表示 HTTP 请求的响应
来源
Header 类型表示 HTTP 头,并提供了访问和修改头字段的方法
Header 不区分大小写,提供的方法包括:
Get(key string) stringSet(key, value string)Add(key, value string)Del(key string)Clone() Header来源
该包为常见的服务器任务提供了几个有用的辅助函数
来源
来源
来源
该包提供了方便的函数用于常见的客户端请求
来源
客户端和服务器都支持 HTTP/2,并具有以下功能:
来源
请求可以与上下文关联以进行取消、超时和值传递
来源
对连接行为进行细粒度控制
来源
Client 和 Transport 是并发安全的Server 和 ServeMux 是并发安全的Request 和 Response 不应并发修改来源
来源