定义结构体
定义一个请求和响应的结构体
type CreateRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
type CreateResponse struct {
Username string `json:"username"`
}
读取请求
gin为我们提供了几种读取请求的API
- Param():返回 URL 的参数值,例如/user/:id
- Query():读取 URL 中的地址参数,例如GET /path?id=1234&name=Manu&value=
- DefaultQuery():类似 Query(),但是如果 key 不存在,会返回默认值,例如GET /?name=Manu&lastname=
- Bind():检查 Content-Type 类型,将消息体作为指定的格式解析到 Go struct 变量中。apiserver 采用的媒体类型是 JSON,所以 Bind() 是按 JSON 格式解析的。
- GetHeader():获取 HTTP 头。
- 将我们需要的信息从请求中读取出来
var r CreateRequest
err := c.Bind(&r)
if err!=nil{
handler.SendResponse(c,errno.ErrBind,nil)
return
}
user := c.Param("username")
log.Printf("URL username: %s",user)
desc := c.Query("desc")
log.Printf("URL key param desc: %s", desc)
contentType := c.GetHeader("Content-Type")
log.Printf("Header Content-Type: %s", contentType)
log.Printf("username is: [%s], password is [%s]", r.Username, r.Password)
- 根据读取的信息,确定返回的响应内容
if r.Username == "" {
handler.SendResponse(c, errno.New(errno.ErrUserNotFound, fmt.Errorf("username can not found in db: xx.xx.xx.xx")), nil)
return
}
if r.Password == "" {
handler.SendResponse(c, fmt.Errorf("password is empty"), nil)
}
rsp := CreateResponse{
Username: r.Username,
}
handler.SendResponse(c,nil,rsp)
返回响应
- 带错误信息的响应体
type Response struct {
Code int `json:"code"`
Message string `json:"message"`
Data interface{} `json:"data"`
}
- 将错误信息也封装到响应体当中
func SendResponse(c *gin.Context,err error,data interface{}) {
code, message := errno.DecodeErr(err)
c.JSON(http.StatusOK,Response{Code: code,Message: message,Data: data})
}
测试
-
测试样例
-
测试结果