gin框架获取参数


获取header头里的参数:

scene := httpext.GetHeaderByName(ctx, "scene") // online / dev
// @desc 通过上下文获取header中指定key的内容
func GetHeaderByName(ctx *gin.Context, key string) string {
   return ctx.Request.Header.Get(key)
}
//获取用户微信信息表里的数据
body, _ := ctx.Get("json")
us.UserWxModel.WxUserInfo = service.BuildNick(body.(string)) /*编码特殊特号*/

httpext包

package httpext

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "io/ioutil"
   "linkbook.com/LinkBookGo/lib/apilog"
)

// @desc 通过上下文获取header中指定key的内容
func GetHeaderByName(ctx *gin.Context, key string) string {
   return ctx.Request.Header.Get(key)
}

// @desc 通过上下文获取body内容并将内容写到指定key中
func SetBodyJson(context *gin.Context, key string) {
   body, _ := ioutil.ReadAll(context.Request.Body)
   apilog.DebugLog("当前请求数据内容:", string(body[:]))
   fmt.Println("当前请求的数据:", string(body[:]))
   context.Set(key, string(body[:]))
}

方法二:

~~~
//获取body里的数据
func getBodyData(c *server.Context) string {
   var bodyBytes []byte
   if c.Request.Body != nil {
      bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
   }
   // 把刚刚读出来的再写进去
   c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
   return string(bodyBytes)
}
~~~

https://www.bilibili.com/video/av68769981/?p=2

课程代码:
https://www.qfgolang.com/?special=ginkuangjia&pid=2783
https://www.liwenzhou.com/posts/Go/Gin_framework/


package main

import (
   "bytes"
   "encoding/json"
   "fmt"
   "log"
   "strconv"
   "github.com/gin-gonic/gin"
)

func main() {
   engine := gin.Default()



   // GET请求 Query / DefaultQuery 单个接收get参数

   //http://localhost:8080/hello?name=haima
   engine.GET("/hello", func(context *gin.Context) {
      fmt.Println(context.FullPath())

      //获取字符串参数
      username := context.Query("name") //方法一
      fmt.Println(username)
      //name := context.DefaultQuery("name", "") //方法二
      //fmt.Println(name)

      context.Writer.Write([]byte("Hello," + username)) //Hello,go
   })

   type Student struct {
      Name    string `form:"name"`
      Classes string `form:"classes"`
   }


   // GET请求 ShouldBindQuery 批量接收get参数

   // http://localhost:8080/hello2?name=davie&classes=软件工程
   engine.GET("/hello2", func(context *gin.Context) {
      fmt.Println(context.FullPath())
      var student Student
      err := context.ShouldBindQuery(&student)
      if err != nil {
         log.Fatal(err.Error())
      }

      fmt.Println(student.Name)    //davie
      fmt.Println(student.Classes) //软件工程
      context.Writer.Write([]byte("hello," + student.Name))

   })

   type Register struct {
      UserName string `form:"name"`
      Phone    string `form:"phone"`
      Password string `form:"pwd"`
   }

   //http://localhost:8080/login
   //单个接收post过来的参数
   engine.POST("/login", func(context *gin.Context) {

      fmt.Println(context.FullPath()) // /login
      username := context.PostForm("username") //方法一
      //username, exist := context.GetPostForm("username") //方法二
      userId, _ := strconv.ParseInt(context.Query("user_id"), 10, 64)

      //if !exist {
      // fmt.Println(username) //adf
      //}

      //password := context.PostForm("pwd")
      password, exists := context.GetPostForm("pwd") //12323
      //password:= com.StrTo(context.GetPostForm("pwd")).MustInt()

      if !exists {
         fmt.Println(password) //12323
      }
      fmt.Printf("%T %s\n", username,username)  //string adf
      fmt.Printf("%T %d\n", userId,userId) //int64 0
      fmt.Printf("%T %s\n", password,password) //string 12323
      context.Writer.Write([]byte("Hello  " + username + ", pwd:" + password)) //Hello  go, pwd:123
   })

   //http://localhost:8080/register
   // ShouldBind 批量接收post数据 application/x-www-form-urlencoded方式
   engine.POST("/register", func(context *gin.Context) {
      fmt.Println(context.FullPath())
      var register Register
      if err := context.ShouldBind(&register); err != nil {
         log.Fatal(err.Error())
         return
      }

      fmt.Println(register.UserName)
      fmt.Println(register.Phone)
      context.Writer.Write([]byte(register.UserName + " Register "))

   })

 
   // POST multipart/form-data 方式 
   formData,err:=c.MultipartForm()
   fmt.Println("++MultipartForm++",formData,err)
   for k,v :=range formData.Value{
      fmt.Println("k---->",k)   #k----> name k----> age
      fmt.Println("v---->",v[0])  #v----> haima v----> 30 
   }   


   // BindJSON 批量接收 post raw json 数据 方法一

   //http://localhost:8080/testpost
   //{
   // "user_id": 1,
   // "linkbook_id": "001",
   // "type":"education",
   // "id": 2
   //}
   engine.POST("/testpost", func(ctx *gin.Context) {
      fmt.Println(ctx.FullPath())

      type delInfo struct {
         UserID     int    `from:"user_id"`
         LinkbookID string `from:"linkbook_id"`
         Type       string `from:"type"`
         ID         int    `from:"id"`
      }
      var delInfoParam delInfo
      if err := ctx.BindJSON(&delInfoParam); err != nil {
         log.Fatal(err.Error())
         return
      }

      ctx.Writer.Write([]byte("Hello," + delInfoParam.Type)) //Hello,go
   })

   // BindJSON 批量接收 post raw json 数据 方法二

   //http://localhost:8080/test
   engine.POST("/test", func(context *gin.Context) {
      fullPath := "请求路径:" + context.FullPath()
      fmt.Println(fullPath)
      SetBodyJson(context, "json")
      var delInfo map[string]interface{}
      err := getRequestBody(context, &delInfo)
      fmt.Println(err)
      fmt.Println(delInfo)
   })


   //http://localhost:8080/user/22
   engine.DELETE("/user/:id", DeleteHandle)

   engine.Run(":8090")
}

//http://localhost:8080/user/adf
func DeleteHandle(context *gin.Context) {
   fmt.Println(context.FullPath()) //  /user/:id

   userID := context.Param("id")

   fmt.Println(userID) //adf

   context.Writer.Write([]byte("Delete user's id : " + userID)) //Delete user's id : adf
}


func getRequestBody(context *gin.Context, s interface{}) error {
   body, _ := context.Get("json")
   reqBody, _ := body.(string)
   decoder := json.NewDecoder(bytes.NewReader([]byte(reqBody)))
   decoder.UseNumber()
   err := decoder.Decode(&s)
   return err
}

// @desc 通过上下文获取body内容并将内容写到指定key中
func SetBodyJson(context *gin.Context, key string) {
   body := make([]byte, 1048576)
   n, _ := context.Request.Body.Read(body)
   fmt.Println("request body:", n)
   context.Set(key, string(body[0:n]))
}


//type People interface {
// name()
//}
//
//type Wang struct {
// Name string
//}
//
//func (p *Wang) name() {
// p.Name = "wang"
//}
//
//func (p *Wang) sayMyName() {
// fmt.Println(p.Name)
//}

context.Param获取请求参数

客户端的请求接口是DELETE类型,请求url为:http://localhost:9000/user/1。

最后的1是要删除的用户的id,是一个变量。因此在服务端gin中,

通过路由的:id来定义一个要删除用户的id变量值,

同时使用context.Param进行获取

posted @ 2021-01-27 20:40  HaimaBlog  阅读(3045)  评论(0编辑  收藏  举报