目录

获取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进行获取

gin框架获取参数的更多相关文章

  1. DRF框架获取参数的方式

    DRF获取参数的方式 例如url url(r'^demo/(?P<word>.*)/$', DemoView.as_view()) 在类视图中获取参数 url:http://127.0.0 ...

  2. Node.js中的express框架获取参数

    express获取参数有三种方法: req.query  适合 http://localhost:3000/form?num=8888 req.body   适合http://localhost:30 ...

  3. Gin框架body参数获取

    需求: 记录所有请求的json数据 body, _ := ioutil.ReadAll(c.Request.Body) if body != nil { log.Info("请求body内容 ...

  4. Gin框架之参数绑定

    为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString.form表单.JSON.XML等参数到结构 ...

  5. Gin框架使用详解

    1.什么是Gin Gin是go编写的一个web应用框架. 2.Gin安装 go get github.com/gin-gonic/gin 3.Gin使用示例 package main import ( ...

  6. go的gin框架从请求中获取参数的方法

    前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST   /post/te ...

  7. Gin框架系列02:路由与参数

    回顾 上一节我们用Gin框架快速搭建了一个GET请求的接口,今天来学习路由和参数的获取. 请求动词 熟悉RESTful的同学应该知道,RESTful是网络应用程序的一种设计风格和开发方式,每一个URI ...

  8. Node.js中的express框架获取http参数

    最近本人在学习开发NodeJs,使用到express框架,对于网上的学习资料甚少,因此本人会经常在开发中做一些总结. express获取参数有三种方法:官网介绍如下 Checks route para ...

  9. Gin框架04:趣谈参数绑定与校验

    导读 在第二节,我们学习了Gin框架的路由定义与参数接收,今天应一位同学的要求,来讲解一下参数的绑定与校验. 为什么校验参数? 本不必抛出这个问题的,但顾及到初出茅庐的同学,这里解释一下. 假设做一个 ...

  10. gin框架中的参数验证

    结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else,会简洁许多. 处理请求方法 func structValidator(context *gin.Context) { var ...

随机推荐

  1. KingbaseES V8R6集群运维案例之---sys_monitor.sh start启动动态库错误

    案例说明: 在KingbaseES V8R6集群部署了postgis后,执行sys_monitor.sh start启动集群时,出现动态库错误,如下图所示: 适用版本: KingbaseES V8R6 ...

  2. kingbaseES V8R3集群运维案例之---集群部署前后ssh端口修改

    kingbaseES V8R3集群运维案例之---集群部署前后ssh端口修改 案例说明: kingbaseES V8R3集群部署读写分离的集群是使用ssh的默认端口(22)部署,当改为非默认端口时,在 ...

  3. KingbaseES数据库-生产环境慢查询性能优化案例

    一.背景 在生产环境中,慢查询不仅影响系统.业务的正常处理.同时严重影响用户的使用感受. 二.表相关信息 2.1 表结构及索引: Table "yktcore.t_dtl_ymt" ...

  4. KingbaseES V8R6 集群运维系列--sys_monitor.sh stop关闭集群分析

    案例说明: 对于KingbaseES V8R6集群关闭整个集群通过执行'sys_monitor.sh stop'命令完成,本案例解析了在执行'sys_monitor.sh stop'后,数据库的关闭方 ...

  5. KingbaseES 数据库安装报错案例分析

    Linux系统安装V008R006C007B0012版本KingbaseES数据库报错:Unsupported major.minor version 52.0 系统版本: [root@vm-10-3 ...

  6. 存储过程 RETURN语句

    1.RETURN 如果没有使用表达式,RETURN 命令用于告诉这个函数已经完成执行了,如示例2. 如果返回标量类型,那么可以使用任何表达式. 示例1: 带有表达式return CREATE OR R ...

  7. Notion笔记汉化

    Notion笔记汉化 参考:https://github.com/Reamd7/notion-zh_CN 关注我的订阅号[靠谱杨阅读人生]回复[Notion]获取中文包 1.进入notion的安装路径 ...

  8. Python 列表list方法clear( )和直接list [ ]的区别

    x.clear()是将内存地址清空, x=[ ]会新开辟一个内存空间.

  9. #网络流,树状数组#JZOJ 4020 Revolution with JZOJ 4018 Magic

    CF297E Mystic Carvings=JZOJ 4018 Magic JZOJ 4020 Revolution 题目 有一个\(n*m(n,m\leq 20)\)的网格图 这格子有收益当且仅当 ...

  10. 在DAYU200上实现OpenHarmony视频播放器

    内容简介 本文介绍了如何使用ArkUI框架提供的video组件,实现一个具有简易播放器.通过VideoController控制器来控制倍速.全屏.进度调节等功能. 由于使用本地视频文件会影响App的包 ...