如何高效获取Go Gin框架中的参数?

摘要:GIN参数获取 query 参数1. DefaultQuery 获取不到地址栏参数,设置默认值 username:=c.DefaultQuery("username",&a
GIN参数获取 query 参数 // 1. DefaultQuery 获取不到地址栏参数,设置默认值 username:=c.DefaultQuery("username","zhangsan") // 2. Query 获取地址栏参数 address := c.Query("address") form 参数 // 1. DefaultPostForm ,取不到数据时返回默认值 username:=c.DefaultPostForm("username","zhangsan") // 2. PostForm 获取 form表单中的数据 address:=c.PostForm("address") json参数 // 1. 从c.Request.Body 请求体中获取数据 //1.1 body 是字符串数据 body,_ :=c.GetRawData() //1.2 定义MAP或者结构体 var m map[string]interface{} // 1.3 反序列化 _ = json.Unmarshal(body,&m) path 参数(路由固定参数) // 定义路由时,访问路径如下 http://xxx:8080/api/user/:id // 获取路由上携带的参数 id:=c.Param("id") ShouldBind参数绑定 基于请求的Content-Type 自动识别数据类型,并利用反射机制提取请求中的数据给到对应的结构体中 // 定义结构体。form/json是tag,表示从页面或接口调用时传递的参数名。binding是必填tag type Login struct { User string `form:"user" json:"user" binding:"required"` Password string `form:"password" json:"password" binding:"required"` } var loginReq Login // 1. JSON 绑定: ShouldBind c.ShouldBind(&login) // 传入结构体对象地址 // 2. Form 绑定: ShouldBind c.ShouldBind(&login); // 3. QueryString 地址栏绑定: ShouldBind c.ShouldBind(&login); 文件上传 单个文件上传 package main import ( "fmt" "github.com/gin-gonic/gin" "log" "os" ) func main() { router := gin.Default() router.POST("/upload", func(c *gin.Context) { file, _ := c.FormFile("file") log.Println(file.Filename) // 当前路径 pwd, _ := os.Getwd() fmt.Println("当前路径pwd:", pwd) savePath := pwd + "/static/upload/" fmt.Println("存储路径savePath:", savePath) // 保存文件,如果目录不存在就创建该目录 if _, err := os.Stat(savePath); os.IsNotExist(err) { os.Mkdir(savePath, 0755) } dst := savePath + file.Filename c.SaveUploadedFile(file, dst) c.JSON(200, gin.H{ "message": "upload success", }) }) router.Run(":8080") } 多个文件上传 package main import ( "fmt" "github.com/gin-gonic/gin" "log" "os" ) func main() { router := gin.Default() router.POST("/upload", func(c *gin.Context) { // 处理multipart forms提交文件时默认的内存限制是32 MiB // 可以通过下面的方式修改 //router.MaxMultipartMemory = 8 << 20 // 8 MiB form, _ := c.MultipartForm() files := form.File["file"] for _, file := range files { log.Println(file.Filename) // 当前路径 pwd, _ := os.Getwd() fmt.Println("当前路径pwd:", pwd) savePath := pwd + "/static/upload/" fmt.Println("存储路径dst:", savePath) // 保存文件,如果目录不存在就创建该目录 if _, err := os.Stat(savePath); os.IsNotExist(err) { os.Mkdir(savePath, 0755) } dst := savePath + file.Filename c.SaveUploadedFile(file, dst) } c.JSON(200, gin.H{ "message": "upload success", }) }) router.Run(":8080") }