# 請(qǐng)求
其實(shí)在[流程](../chaptero1/0101_flow.md) 中就有講到。
在請(qǐng)求來(lái)到服務(wù)器后,Context對(duì)象會(huì)生成用來(lái)串流程:
和請(qǐng)求有關(guān)的字段包括:
```
// context.go:40
type Context struct {
// ServeHTTP的第二個(gè)參數(shù): request
Request *http.Request
// URL里面的參數(shù),比如:/xx/:id
Params Params
}
```
### 獲取restful接口的參數(shù)
在路由解析時(shí)會(huì)初始化 `Params`
提供Get函數(shù):
```
Param(key string) string
```
### 獲取請(qǐng)求數(shù)據(jù):
```
// Header
GetHeader(key string) string
// c.Request.Body
GetRawData() ([]byte, error)
// Cookie
Cookie(name string) (string, error)
//從GET參數(shù)中拿值,比如 /path?id=john
// 實(shí)現(xiàn)原理:調(diào)用系統(tǒng)庫(kù):*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中拿數(shù)據(jù)
// 實(shí)現(xiàn)原理:調(diào)用系統(tǒng)庫(kù):*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
// 文件
// 實(shí)現(xiàn)原理:調(diào)用系統(tǒng)庫(kù):*http.Request.FormFile()
FormFile(name string) (*multipart.FileHeader, error)
MultipartForm() (*multipart.Form, error)
SaveUploadedFile(file *multipart.FileHeader, dst string) error
```
### 數(shù)據(jù)對(duì)象化
```
Bind(obj interface{}) error //根據(jù)Content-Type綁定數(shù)據(jù)
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
```
我們仔細(xì)看看實(shí)現(xiàn)邏輯
```
// 首先有一個(gè)Binding接口,
//binding/binding.go:27
type Binding interface {
// 綁定器的名稱(chēng)
Name() string
// 進(jìn)行數(shù)據(jù)綁定
Bind(*http.Request, interface{}) error
}
// 然后有一個(gè)矩陣得到binding對(duì)象
//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
// 最后還有數(shù)據(jù)校驗(yàn),使用的是 `go-playground/validator.v8`
```
### 其他工具方法
```
ClientIP() string
ContentType() string
IsWebsocket() bool
```
