控制器

  • 数据解析绑定

模型绑定可以将请求体绑定给一个类型,目前支持绑定的类型有 JSON, XML 和标准表单数据 (foo=bar&boo=baz)。
要注意的是绑定时需要给字段设置绑定类型的标签。比如绑定 JSON 数据时,设置 json:"fieldname"
使用绑定方法时,Gin 会根据请求头中 Content-Type 来自动判断需要解析的类型。如果你明确绑定的类型,你可以不用自动推断,而用 BindWith 方法。
你也可以指定某字段是必需的。如果一个字段被 binding:"required" 修饰而值却是空的,请求会失败并返回错误。

  1. // Binding from JSON
  2. type Login struct {
  3. User string `form:"user" json:"user" binding:"required"`
  4. Password string `form:"password" json:"password" binding:"required"`
  5. }
  6. func main() {
  7. router := gin.Default()
  8. // 绑定JSON的例子 ({"user": "manu", "password": "123"})
  9. router.POST("/loginJSON", func(c *gin.Context) {
  10. var json Login
  11. if c.BindJSON(&json) == nil {
  12. if json.User == "manu" && json.Password == "123" {
  13. c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
  14. } else {
  15. c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
  16. }
  17. }
  18. })
  19. // 绑定普通表单的例子 (user=manu&password=123)
  20. router.POST("/loginForm", func(c *gin.Context) {
  21. var form Login
  22. // 根据请求头中 content-type 自动推断.
  23. if c.Bind(&form) == nil {
  24. if form.User == "manu" && form.Password == "123" {
  25. c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
  26. } else {
  27. c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
  28. }
  29. }
  30. })
  31. // 绑定多媒体表单的例子 (user=manu&password=123)
  32. router.POST("/login", func(c *gin.Context) {
  33. var form LoginForm
  34. // 你可以显式声明来绑定多媒体表单:
  35. // c.BindWith(&form, binding.Form)
  36. // 或者使用自动推断:
  37. if c.Bind(&form) == nil {
  38. if form.User == "user" && form.Password == "password" {
  39. c.JSON(200, gin.H{"status": "you are logged in"})
  40. } else {
  41. c.JSON(401, gin.H{"status": "unauthorized"})
  42. }
  43. }
  44. })
  45. // Listen and serve on 0.0.0.0:8080
  46. router.Run(":8080")
  47. }