Go语言实战 : API服务器 (6) 读取请求以及返回响应

348 阅读1分钟

定义结构体

定义一个请求和响应的结构体

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 头。
  1. 将我们需要的信息从请求中读取出来
	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)
  1. 根据读取的信息,确定返回的响应内容
        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)

返回响应

  1. 带错误信息的响应体
type Response struct {
	Code int `json:"code"`
    Message string `json:"message"`
	Data interface{} `json:"data"`
}

  1. 将错误信息也封装到响应体当中
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})

}

测试

  1. 测试样例 image.png

  2. 测试结果 image.png