1、HTTP 响应报文结构
前面几篇教程我们了解了如何在 Go 语言中解析用户请求信息,包括表单字段和文件上传,接下来,我们来看看处理完请求后,如何将响应发送给客户端。HTTP 响应的报文结构如下所示:
![451c7074aa2482ed77cb2af58d354a27.png](https://img-blog.csdnimg.cn/img_convert/451c7074aa2482ed77cb2af58d354a27.png)
HTTP 响应报文结构
和 HTTP 请求报文结构类似,响应报文也可以分为三部分:状态行、响应头(首部字段)和响应主体。
首先是状态行,在状态行中包含了 HTTP 协议版本和响应状态码,200 OK 表示响应成功,更多状态码信息(常见的有 404、403、500、301 等)可以网上查看下 HTTP 协议或者阅读 HTTP 响应状态码这篇文章了解。
然后是响应头,其中包含了 HTTP 响应的首部字段,比如内容类型/编码、缓存控制、Cookie 信息等。
最后是响应实体,对于 API 接口来说,通常就是返回的 XML/JSON 格式数据,对于 HTML 视图响应,就是一个标准的 HTML 文档,如上图所示。响应头和响应报文之间通过两个换行符分隔。
2、ResponseWriter 接口
在 Go 语言中,客户端请求信息都封装到了 Request 对象,但是发送给客户端的响应并不是 Response 对象,而是 ResponseWriter:
func Home(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Welcome to my blog site")}
ResponseWriter 是处理器用来创建 HTTP 响应的接口,其源码结构如下所示:
type ResponseWriter interface { // 用于设置/获取所有响应头信息 Header() Header // 用于写入数据到响应实体 Write([]byte) (int, error) // 用于设置响应状态码 WriteHeader(statusCode int)}
实际上,在底层支撑 ResponseWriter 的结构体就是 http.response,详见 net/http 包下 server.go 中的 readRequest 方法(调用处理器处理 HTTP 请求时调用了该方法返回响应对象),并且其返回值是 response 指针,这也是为什么在处理器方法声明的时候 Request 是指针类型,而 ResponseWriter 不是,实际上在底层,响应对象也是指针类型(因为在应用代码中需要设置响应头和响应实体,所以响应对象理应是指针类型)&#x