gin请求
397字约1分钟
2025-02-15
查询参数
例如:?key=xxx&name=xxxx&name=yyyy
查询参数不是GET请求专属的
name := c.Query("name")
age := c.DefaultQuery("age", "25")
keyList := c.QueryArray("key")
fmt.Println(name, age, keyList)例如请求 ?name=azhe&age=123&key=123&key=124,输出为:
azhe 123 [123 124]动态参数
用户的个人信息页面
/users?id=123 // 查询参数的模式
/users/123 // 动态参数模式r.GET("users/:id", func(c *gin.Context) {
  userID := c.Param("id")
  fmt.Println(userID)
})表单参数
一般就是专指form表单
name := c.PostForm("name")
age, ok := c.GetPostForm("age")
fmt.Println(name)
fmt.Println(age, ok)文件上传
r.POST("users", func(c *gin.Context) {
  fileHeader, err := c.FormFile("file")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(fileHeader.Filename) // 文件名
  fmt.Println(fileHeader.Size)     // 文件大小,单位是字节
  file, _ := fileHeader.Open()
  byteData, _ := io.ReadAll(file)
  err = os.WriteFile("xxx.jpg", byteData, 0666)
  fmt.Println(err)
})一种简单方式
err = c.SaveUploadedFile(fileHeader, "uploads/xxx/yyy/"+fileHeader.Filename)
fmt.Println(err)多文件上传
r.POST("users", func(c *gin.Context) {
    form, err := c.MultipartForm()
    if err != nil {
      fmt.Println(err)
      return
    }
    for _, headers := range form.File {
      for _, header := range headers {
        c.SaveUploadedFile(header, "uploads/"+header.Filename)
      }
    }
  })关于接口测试工具
postman
apifox
注意
接口测试工具能走通的,前端请求不一定可以走通
- get请求带请求体
- ws加请求头
原始内容
不同的请求体对应的原始内容
body阅后即焚问题解决
byteData, _ := io.ReadAll(c.Request.Body)
fmt.Println(string(byteData))
// 读了之后,body就没了,阅后即焚
c.Request.Body = io.NopCloser(bytes.NewReader(byteData))form-data
----------------------------853882779395683818968400
Content-Disposition: form-data; name="name"
阿哲
----------------------------853882779395683818968400
Content-Disposition: form-data; name="age"
1234
----------------------------853882779395683818968400--对应的分隔符是
Content-Type:[multipart/form-data; boundary=--------------------------052455317193517003536866]x-www-form-urlencoded
url编码
name=%E6%9E%AB%E6%9E%AB&age=1234json
{
    "name": "阿哲",
    "age": 23
}