[接受客户端json]Gin学习笔记Day001

155 阅读1分钟

在POST请求中,常用的除了FormData,json格式可能更常用; FromData可以使用DefaultPostForm来实现;

如何接受来自前端json格式请求?

注:前端的请求headers中Content-Type: application/json

下面具体实现:

package main  
  
import (  
"github.com/gin-gonic/gin"  
"net/http"  
)  
  
func main() {  
    router := gin.Default()   

    // 定义一个结构体
    // 结构用 type 关键字定义
    // 结构体包含一个或多个【字段】
    // 每个字段都有一个【名字】和【类型】
    // 1.  `Name`:字段名,表示结构体中的一个字段。
    // 2.  `string`:字段类型,表示该字段的数据类型是字符串。
    // 3.  `json:"name"`:标签(tag),用于在 JSON 编码和解码时指定字段名。
    type User struct {  
        Name string `json:"name"`  
        Age int `json:"age"`  
    }
  
    router.POST("user", func(c *gin.Context) {  
        var user User  
        // c.BindJSON是接受json的关键,用于将 HTTP 请求中的 JSON 数据解析并绑定到指定的结构体变量 `user` 中。
        // &user是一个指针引用,会直接修改👆申明的user变量;
        // c.BindJSON 会返回一个错误(如果有)
        if err := c.BindJSON(&user); err != nil {  
            c.JSONP(http.StatusBadRequest, gin.H{"error": err.Error()})  
            return  
        }  
        c.JSONP(http.StatusOK, user)  
    })  
  
    router.Run(":8080") // 监听并在 0.0.0.0:8080 上启动服务  
}

几个关键

  1. 定义一个结构体
  2. 创建一个结构体变量
  3. 在路由中使用c.BindJSON(&结构体变量)将请求中的JOSN数据解析并绑定到指定的结构体变量
  4. (使用user)

ApiFox请求

image.png

额外-设置某个字段是必须的

type User struct {  
    Name string `json:"name" binding:"required"`  
    Age int `json:"age"`  
}
Name string `json:"name" binding:"required"`

binding:"required"就可以了

如果前端不传age字段,age字段不是必须的->正常200

image.png

如果前端不传name字段,name字段是必须的->错误400

image.png