zoukankan      html  css  js  c++  java
  • 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
    ", username,username)  //string adf
          fmt.Printf("%T %d
    ", userId,userId) //int64 0
          fmt.Printf("%T %s
    ", 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进行获取

    [Haima的博客] http://www.cnblogs.com/haima/
  • 相关阅读:
    Android 3.0 r1 API中文文档(108) —— ExpandableListAdapter
    Android 3.0 r1 API中文文档(113) ——SlidingDrawer
    Android 3.0 r1 API中文文档(105) —— ViewParent
    Android 中文 API (102)—— CursorAdapter
    Android开发者指南(4) —— Application Fundamentals
    Android开发者指南(1) —— Android Debug Bridge(adb)
    Android中文API(115)——AudioFormat
    Android中文API(116)——TableLayout
    Android开发者指南(3) —— Other Tools
    Android中文API (110) —— CursorTreeAdapter
  • 原文地址:https://www.cnblogs.com/haima/p/14336826.html
Copyright © 2011-2022 走看看