# 请求
其实在[流程](../chaptero1/0101_flow.md) 中就有讲到。
在请求来到服务器后,Context对象会生成用来串流程:
和请求有关的字段包括:
```
// context.go:40
type Context struct {
// ServeHTTP的第二个参数: request
Request *http.Request
// URL里面的参数,比如:/xx/:id
Params Params
}
```
### 获取restful接口的参数
在路由解析时会初始化 `Params`
提供Get函数:
```
Param(key string) string
```
### 获取请求数据:
```
// Header
GetHeader(key string) string
// c.Request.Body
GetRawData() ([]byte, error)
// Cookie
Cookie(name string) (string, error)
//从GET参数中拿值,比如 /path?id=john
// 实现原理:调用系统库:*http.Request.URL.Query()
GetQueryArray(key string) ([]string, bool)
GetQuery(key string)(string, bool)
Query(key string) string
DefaultQuery(key, defaultValue string) string
GetQueryArray(key string) ([]string, bool)
QueryArray(key string) []string
//从POST中拿数据
// 实现原理:调用系统库:*http.Request.PostForm() 和 *http.Request.MultipartForm.Value
GetPostFormArray(key string) ([]string, bool)
PostFormArray(key string) []string
GetPostForm(key string) (string, bool)
PostForm(key string) string
DefaultPostForm(key, defaultValue string) string
// 文件
// 实现原理:调用系统库:*http.Request.FormFile()
FormFile(name string) (*multipart.FileHeader, error)
MultipartForm() (*multipart.Form, error)
SaveUploadedFile(file *multipart.FileHeader, dst string) error
```
### 数据对象化
```
Bind(obj interface{}) error //根据Content-Type绑定数据
BindJSON(obj interface{}) error
BindQuery(obj interface{}) error
//--- Should ok, else return error
ShouldBindJSON(obj interface{}) error
ShouldBind(obj interface{}) error
ShouldBindJSON(obj interface{}) error
ShouldBindQuery(obj interface{}) error
//--- Must ok, else SetError
MustBindJSON(obj interface{}) error
```
我们仔细看看实现逻辑
```
// 首先有一个Binding接口,
//binding/binding.go:27
type Binding interface {
// 绑定器的名称
Name() string
// 进行数据绑定
Bind(*http.Request, interface{}) error
}
// 然后有一个矩阵得到binding对象
//binding/binding.go:70
method content-type binding
-----------------------------------------------
GET * Form
* application/json JSON
* application/xml XML
* text/xml XML
* application/x-protobuf ProtoBuf
* application/x-msgpack MsgPack
* application/msgpack MsgPack
* 其他 Form
// 最后还有数据校验,使用的是 `go-playground/validator.v8`
```
### 其他工具方法
```
ClientIP() string
ContentType() string
IsWebsocket() bool
```