跳到主要内容

响应

其实在 流程 中就有讲到。

在请求来到服务器后,Context对象会生成用来串流程: 和请求有关的字段包括:

// context.go:40
type Context struct {
// 用来响应
Writer ResponseWriter
writermem responseWriter
}

// response_writer.go:20
type ResponseWriter interface {
http.ResponseWriter //嵌入接口
http.Hijacker //嵌入接口
http.Flusher //嵌入接口
http.CloseNotifier //嵌入接口

// 返回当前请求的 response status code
Status() int

// 返回写入 http body的字节数
Size() int

// 写string
WriteString(string) (int, error)

//是否写出
Written() bool

// 强制写htp header (状态码 + headers)
WriteHeaderNow()
}

// response_writer.go:40
// 实现 ResponseWriter 接口
type responseWriter struct {
http.ResponseWriter
size int
status int
}

初始化过程

在请求来到服务器时,会从对象池中拿到一个Context对象;

// 1 初始化writermem
// gin.go:322
c.writermem.reset(w)

func (w *responseWriter) reset(writer http.ResponseWriter) {
w.ResponseWriter = writer
w.size = noWritten
w.status = defaultStatus
}

// 2 初始化context
// gin.go:324
c.reset()

func (c *Context) reset() {
c.Writer = &c.writermem
c.Params = c.Params[0:0]
c.handlers = nil
c.index = -1
c.Keys = nil
c.Errors = c.Errors[0:0]
c.Accepted = nil
}

设置响应码、cookie、header等

// 实现原理:设置c.writermen.status
Status(code int) // 设置response code
// 实现原理: 调用系统函数
Header(key, value string) // 设置header

// 实现原理: 调用系统函数
SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

设置返回的数据

Render(code int, r render.Render)      // 数据渲染
HTML(code int, name string, obj interface{}) //HTML
JSON(code int, obj interface{}) //JSON
IndentedJSON(code int, obj interface{})
SecureJSON(code int, obj interface{})
JSONP(code int, obj interface{}) //jsonp
XML(code int, obj interface{}) //XML
YAML(code int, obj interface{}) //YAML
String(code int, format string, values ...interface{}) //string
Redirect(code int, location string) // 重定向
Data(code int, contentType string, data []byte) // []byte
File(filepath string) // file
SSEvent(name string, message interface{}) // Server-Sent Event
Stream(step func(w io.Writer) bool) // stream

我们仔细看看实现逻辑:

// 实现有一个 Render接口
// render/render.go:9
type Render interface {
Render(http.ResponseWriter) error
WriteContentType(w http.ResponseWriter)
}

// 自己选择具体的实现,有
- JSON
- IndentedJSON
- SecureJSON
- JsonpJSON
- XML
- String
- Redirect
- Data
- HTML
- HTMLDebug
- HTMLProduction
- YAML
- MsgPack

// 对应实现进行具体操作,完成数据输出