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(®ister); 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框架获取参数的更多相关文章
- DRF框架获取参数的方式
DRF获取参数的方式 例如url url(r'^demo/(?P<word>.*)/$', DemoView.as_view()) 在类视图中获取参数 url:http://127.0.0 ...
- Node.js中的express框架获取参数
express获取参数有三种方法: req.query 适合 http://localhost:3000/form?num=8888 req.body 适合http://localhost:30 ...
- Gin框架body参数获取
需求: 记录所有请求的json数据 body, _ := ioutil.ReadAll(c.Request.Body) if body != nil { log.Info("请求body内容 ...
- Gin框架之参数绑定
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString.form表单.JSON.XML等参数到结构 ...
- Gin框架使用详解
1.什么是Gin Gin是go编写的一个web应用框架. 2.Gin安装 go get github.com/gin-gonic/gin 3.Gin使用示例 package main import ( ...
- go的gin框架从请求中获取参数的方法
前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST /post/te ...
- Gin框架系列02:路由与参数
回顾 上一节我们用Gin框架快速搭建了一个GET请求的接口,今天来学习路由和参数的获取. 请求动词 熟悉RESTful的同学应该知道,RESTful是网络应用程序的一种设计风格和开发方式,每一个URI ...
- Node.js中的express框架获取http参数
最近本人在学习开发NodeJs,使用到express框架,对于网上的学习资料甚少,因此本人会经常在开发中做一些总结. express获取参数有三种方法:官网介绍如下 Checks route para ...
- Gin框架04:趣谈参数绑定与校验
导读 在第二节,我们学习了Gin框架的路由定义与参数接收,今天应一位同学的要求,来讲解一下参数的绑定与校验. 为什么校验参数? 本不必抛出这个问题的,但顾及到初出茅庐的同学,这里解释一下. 假设做一个 ...
- gin框架中的参数验证
结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else,会简洁许多. 处理请求方法 func structValidator(context *gin.Context) { var ...
随机推荐
- jsonb操作符
json类型以文本方式存储json对象,把输入的数据原封不动的存放到数据库中,会保留多余的空格,保留重复的Key,保留Key的顺序. jsonb类型转换文本格式json对象为二进制格式,不保留多余的空 ...
- wordpress自建博客站,在页脚添加网站总访问次数
wordpress自建博客站,在页脚添加网站总访问次数 笔者使用的主题是 GeneratePress 版本:3.1.3 打开footer.php编辑 <div style="text- ...
- 【已解决】VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本,请确保该脚本没有错误。您也可以提交支持请求,报告此问题。
参考:https://www.cnblogs.com/rainbow-1/p/15391407.html
- NodeJS 实战系列:模块设计与文件分类
我们从一个最简单的需求开始,来探索我们应该从哪些方面思考模块设计,以及如何将不同的文件分类.之所以说"思考",是因为我在这篇文章里更多的是提供一类解决问题的范式,而非统一的标准答案 ...
- 8 JavaScript函数
8 JavaScript函数 在JS中声明函数和python差不多. 也要有一个关键字顶在前面. python是def, 到了JS里换成了function, 只不过在JS中没有像python那么死板, ...
- #dp#洛谷 3473 [POI2008] UCI-The Great Escape JZOJ 4019 Path
题目 \(n*m\)的地图,计算从\((n,1)\)到第\(x\)列的第\(y\)行的路径条数\(\bmod k\) , 走过的点不能再走,转弯只能向右转.转弯完之后必须往前走一格 分析 可以发现,走 ...
- OpenHarmony社区运营报告(2022年12月)
本月快讯 • 本月新增22款产品通过兼容性测评,累计220款产品通过兼容性测评. • 12月28日,OpenAtom OpenHarmony(以下简称"OpenHarmony")凭 ...
- C++ 编译器和链接器的完全指南
C++是一种强类型语言,它的编译和链接是程序开发过程中不可或缺的两个环节.编译器和链接器是两个非常重要的概念.本文将详细介绍C++中的编译器和链接器以及它们的工作原理和使用方法. 编译器 编译器是将源 ...
- k8s 深入篇———— docker 是什么[一]
前言 简单的整理一下一些基本概念. 正文 简单运行一个容器: 创建一个容器: docker run -it busybox /bin/bash 然后看下进程: ps -ef 做了一个障眼法,使用的是p ...
- marquee实现滚动
marquee的基本语法:<marquee> ... </marquee> 参数:1.滚动方向 (direction):left(左).right(右).up(上).down( ...