跳到主要内容

请求

其实在 流程 中就有讲到。

在请求来到服务器后,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