# 响应
其实在[流程](../chaptero1/0101_flow.md) 中就有讲到。
在请求来到服务器后,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
// 对应实现进行具体操作,完成数据输出
```