首页 > 其他分享 >go学习02

go学习02

时间:2024-04-30 16:44:40浏览次数:24  
标签:02 name 学习 json func error go gin ginServer

get和post混合取参数

	ginServer.POST("/post", func(c *gin.Context) {

		id := c.Query("id")
		page := c.DefaultQuery("page", "0")
		name := c.PostForm("name")
		message := c.PostForm("message")

		fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
	})


bind绑定参数

1.json绑定

type PostParams struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
	Sex  bool   `json:"sex"`
}

func main() {

	ginServer := gin.Default()

	ginServer.POST("/testBind", func(c *gin.Context) {
		var p PostParams
		error := c.ShouldBindJSON(&p)
		if error != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": error.Error()})
		} else {
			c.JSON(http.StatusOK, gin.H{"data": p})
		}
	})
	ginServer.Run(":8080")
}


2.uri

type PostParams struct {
	Name string `json:"name" uri:"name"`
	Age  int    `json:"age" uri:"age"`
	Sex  bool   `json:"sex" uri:"sex"`
}

func main() {

	ginServer := gin.Default()

	ginServer.POST("/testBind/:name/:age/:sex", func(c *gin.Context) {
		var p PostParams
		error := c.ShouldBindUri(&p)
		if error != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": error.Error()})
		} else {
			c.JSON(http.StatusOK, gin.H{"data": p})
		}
	})
	ginServer.Run(":8080")
}


3.query

type PostParams struct {
	Name string `json:"name" uri:"name" form:"name"`
	Age  int    `json:"age" uri:"age" form:"age"`
	Sex  bool   `json:"sex" uri:"sex" form:"sex"`
}

func main() {

	ginServer := gin.Default()

	ginServer.POST("/testBind", func(c *gin.Context) {
		var p PostParams
		error := c.ShouldBindQuery(&p)
		if error != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": error.Error()})
		} else {
			c.JSON(http.StatusOK, gin.H{"data": p})
		}
	})
	ginServer.Run(":8080")
}


注意:如果一个字段用binding:"required"修饰,并且在绑定时该字段的值为空,那么将返回一个错误。
例如:

Name string `json:"name" uri:"name" form:"name" binding:"required"`

自定义验证器

package main

import (
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
)

// Booking 结构体定义
type Booking struct {
	CheckIn  time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"`
	CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"`
}

// bookableDate 验证器函数,验证日期是否可预订
func bookableDate(fl validator.FieldLevel) bool {
	date, ok := fl.Field().Interface().(time.Time)
	if !ok {
		return false
	}

	// 这里可以添加你的日期可预订的逻辑,例如检查日期是否在某个范围内或者其他条件
	// 这里简单地演示了日期必须在当前日期之后才算可预订
	return date.After(time.Now())
}

func main() {
	// 创建一个默认的 Gin 引擎
	router := gin.Default()

	// 注册自定义验证器到 Gin 的验证器中
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		_ = v.RegisterValidation("bookabledate", bookableDate)
	}

	// 处理 POST 请求提交的表单数据
	router.POST("/book", func(c *gin.Context) {
		var booking Booking

		// 使用 ShouldBind 根据绑定规则验证并解析表单数据
		if err := c.ShouldBind(&booking); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}

		c.JSON(http.StatusOK, gin.H{
			"message": "Booking successful",
			"booking": booking,
		})
	})

	// 启动服务器
	router.Run(":8080")
}

标签:02,name,学习,json,func,error,go,gin,ginServer
From: https://www.cnblogs.com/nltack/p/18168301

相关文章

  • 《Vue学习笔记》-01
    什么是Vue?一款用于构建用户界面的JavaScript框架。单文件组件SFC(Single-FileComponents)<scriptsetup>import{ref}from'vue';constcount=ref(0);</script><template><button@click="count++">Countis{{count}}</button>......
  • 微服务学习总结4.30
    什么是微服务:分布式结构的一种,可涵盖多种语言不同版本的不同模块,提高了系统的可维护性,可伸缩性,可测试性为什么要用微服务:能够把不同模块分离开,提高效率减少压力。而且,微服务的使用可以方便多模块集成,可以实现一些跨版本模块的共同使用。比如如果我使用一个jdk8......
  • 机器学习之决策树
    一、决策树定义:决策树是一种基于树结构的机器学习算法,用于建立一系列的规则来对数据进行分类或预测。二、决策树特征选择2.1特征选择问题在决策树的构建过程中,特征选择是一个关键的步骤,它决定了每个节点应该选择哪个特征来进行分裂。2.2信息增益信息增益是一种常用的特征......
  • P10242 [THUSC 2021] Emiya 家明天的饭
    题目大意有\(n\)个人和\(m\)种菜,第\(i\)个人对第\(j\)道菜的喜爱程度为\(a_{i,j}\)。如果\(a_{i,j}=-1\)则表示不喜欢。现在你要选择一个菜的集合,你会获得喜欢集合中所有菜的人对这些菜的喜爱程度之和的权值,最大化这个权值,\(n\leq20,m\leq10^6,a_{i,j}\leq10......
  • P10241 [THUSC 2021] 白兰地厅的西瓜
    考虑DP,注意到一个简单路径可以被拆为向上的部分和向下的部分。所以设\(f_{u,i}\)表示\(u\)的子树中从\(u\)向下且第一项是\(i\)的LIS的最大长度,\(g_{u,i}\)表示\(u\)的子树中\(u\)的某个子孙向上到\(u\)且最后一项是\(i\)的LIS的最大长度。从\(u\)到父......
  • 解锁HDC 2024之旅:从购票到报名,全程攻略
    本文分享自华为云社区《解锁HDC2024之旅:从购票到报名,全程攻略》,作者:华为云社区精选。Hi,代码界的小伙伴们,集结号已经吹响了!华为开发者大会(HDC2024)——这场汇聚了HarmonyOSNEXT鸿蒙星河版、盘古大模型5.0等创新火花与智慧碰撞的盛宴,将于6月21日至23日在东莞松山湖盛大开启。你是......
  • 【发现一个小问题】golang http client: 配置了Client 对象的 Timeout 就会导致 conte
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯我这样初始化了客户端:varclient=http.Client{Timeout:time.Duration(1000)*time.Millisecond,}然后在request创建过程中使用了context的timeout机制:tim......
  • 2020-2021 ICPC NERC (NEERC), North-Western Russia Regional Contest (Northern Sub
    E-EasyCompare-and-Set题意给定n个条件,如果存在一个合法序列使得这n个判断条件成立,则输出Yes和这个合法序列,否则输出No。分析首先可以发现对于\(w_i=0\)的操作我们可以在处理完\(w_i=1\)的操作之后讨论一下即可。发现\(a_i\)和\(b_i\)很大需要对其进行离散化操作。离......
  • Go语言常用标准库——json、文件操作、template、依赖管理及Go_module使用
    文章目录Go语言之jsonMarshal函数Unmarshal函数Go语言之文件操作打开和关闭文件读取文件file.Read()基本使用循环读取bufio读取文件ioutil读取整个文件文件写入操作Write和WriteStringbufio.NewWriterioutil.WriteFile练习copyFile实现一个cat命令template模板模板示例依......
  • Go语言系列——自定义错误、panic和recover、函数是一等公民(头等函数)、反射、读取文件
    文章目录31-自定义错误使用New函数创建自定义错误使用Errorf给错误添加更多信息使用结构体类型和字段提供错误的更多信息使用结构体类型的方法来提供错误的更多信息32-panic和recover什么是panic?什么时候应该使用panic?panic示例发生panic时的deferrecoverpanic,re......