b2b主要网站有哪些/seo优缺点

b2b主要网站有哪些,seo优缺点,wordpress 数据库配置错误,做网站开始要注意什么gin学习笔记,不仅包含了基本的增删查改外,还包括参数传递,上传下载,模版、session与中间件等,方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…

gin学习笔记,不仅包含了基本的增删查改外,还包括参数传递,上传下载,模版、session与中间件等,方便收藏自习可用

文章目录

  • 获得个请求
  • get打印字符串
  • get请求xml
  • get请求跳转
  • http方法
  • 路由
  • 可以通过Context的Param方法来获取API参数
  • 可以通过DefaultQuery()或Query()方法获取
  • 可以通过GetQuery()与Query()方法获取
  • 可以通过BindQuery
  • 可以通过shouldBindQuery()传递
  • QueryMap进行参数传递
  • 结构体有map进行传递
  • 表单参数传递
  • 路径参数传递
  • 上传一个文件
    • 上传特定文件
    • 上传多个文件
  • 上传,对文件进行保存
    • routes group
    • 404 not found
    • json数据解析和绑定
    • 表单数据解析和绑定
    • url数据绑定
    • 各种数据格式的响应
  • html模板渲染
  • 静态资源文件进行渲染
  • 模版取消转义
  • go重定向
  • cookie
  • 多session
  • redis Session固化存储
  • 异步执行与同步执行
  • 中间件
  • 全局中间件
  • 局部中间件
    • 定义两个路由,计算执行时间
    • cookie的使用
    • Cookie练习
    • 结构体验证
    • 结构体

获得个请求

package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default()//r.Get("/hello")r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "hello world",})})err := r.Run(":8080")if err != nil {panic(err)}
}

get打印字符串

type User struct {Id         int64             `form:"id" json:"id" uri:"id"`Name       string            `form:"name" json:"name" uri:"name"`Address    []string          `form:"address" binding:"required" json:"address" uri:"address"`AddressMap map[string]string `form:"addressMap" json:"addressMap" uri:"addressMap"`
}func main() {r := gin.Default()r.GET("/user/save", func(c *gin.Context) {c.String(http.StatusOK, "this is %s", "ms string value")})r.Run(":8081")
}

get请求xml

type User struct {Id         int64             `form:"id" json:"id" uri:"id" xml:"id"`Name       string            `form:"name" json:"name" uri:"name" xml:"name"`Address    []string          `form:"address" binding:"required" json:"address" uri:"address" xml:"address"`AddressMap map[string]string `form:"addressMap" json:"addressMap" uri:"addressMap" xml:"addressMap"`
}func main() {r := gin.Default()r.GET("/user/save", func(c *gin.Context) {id := c.Query("id")name := c.Query("name")c.XML(http.StatusOK, gin.H{"id": id, "message": name})})r.Run(":8081")
}

get请求跳转

http方法

  • GET :get方法请求一个指定资源的表示形式,或使用GET请求应该只被用于获取数据
  • POST :POST方法用于将实体提交到指定资源,通常会导致在服务器上的状态变化
  • HEAD:HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体
  • PUT:PUT方法用请求有效载荷替换目标资源的所有当前表示
  • DELETE : DELETE 方法删除指定的资源

路由

func main() {r := gin.Default()//r.Get("/hello")r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "hello world",})})r.GET("/get", func(c *gin.Context) {c.JSON(200, gin.H{"message": "hello world",})})r.POST("/save", func(c *gin.Context) {c.JSON(200, gin.H{"message": "save",})})r.PUT("/put", func(c *gin.Context) {c.JSON(200, gin.H{"message": "put",})})r.DELETE("/delete", func(c *gin.Context) {c.JSON(200, gin.H{"message": "hello DELETE",})})r.Any("/Any", func(c *gin.Context) {c.JSON(200, gin.H{"message": "hello Any",})})r.GET("/user/find/:id", func(ctx *gin.Context) {ctx.JSON(200, ctx.Param("id"))})r.GET("/u/*Path", func(ctx *gin.Context) {ctx.JSON(200, ctx.Param("Path"))})v1 := r.Group("/v1"){v1.GET("find", func(ctx *gin.Context) {ctx.JSON(200, gin.H{"message": "find",})})}v2 := r.Group("/v2"){v2.GET("find", func(ctx *gin.Context) {ctx.JSON(200, gin.H{"message": "find",})})}err := r.Run(":8080")if err != nil {panic(err)}
}

可以通过Context的Param方法来获取API参数

func main() {r := gin.Default()r.GET("/user/:name/*action", func(c *gin.Context) {name := c.Param("name")action := c.Param("action")action = strings.Trim(action, "/")c.String(http.StatusOK, name+"is "+action)})//r.POST("/xxxpost", getting)r.Run(":8000")
}

可以通过DefaultQuery()或Query()方法获取

传个localhost:8080/user?name=zhangsan

func main() {r := gin.Default()r.GET("/user", func(c *gin.Context) {name := c.DefaultQuery("name", "枯藤")c.String(http.StatusOK, "Hello %s", name)})r.Run(":8080")
}

可以通过GetQuery()与Query()方法获取

func main() {r := gin.Default()//r.Get("/hello")r.GET("/user/save", func(c *gin.Context) {id := c.Query("id")name := c.Query("name")addr, ok := c.GetQuery("addr")c.JSON(200, gin.H{"id":   id,"name": name,"addr": addr,"errs": ok,})})err := r.Run(":8080")if err != nil {panic(err)}
}

可以通过BindQuery

type User struct {Id   int64  `form:"id"`Name string `form:"name"`
}func main() {r := gin.Default()//r.Get("/hello")r.GET("/user/save", func(c *gin.Context) {var user Usererr := c.BindQuery(&user)if err != nil {log.Fatalln(err)}c.JSON(http.StatusOK, user)})errs := r.Run(":8080")if errs != nil {panic(errs)}
}

可以通过shouldBindQuery()传递

type User struct {Id      int64    `form:"id"`Name    string   `form:"name"`Address []string `form:"address" binding:"required"`
}func main() {r := gin.Default()//r.Get("/hello")r.GET("/user/save", func(c *gin.Context) {var user Userc.ShouldBindQuery(&user)c.JSON(http.StatusOK, user)})errs := r.Run(":8080")if errs != nil {panic(errs)}
}

QueryMap进行参数传递

type User struct {Id      int64    `form:"id"`Name    string   `form:"name"`Address []string `form:"address" binding:"required"`
}func main() {r := gin.Default()//r.Get("/hello")r.GET("/user/save", func(c *gin.Context) {addressMap := c.QueryMap("addressMap")c.JSON(200, addressMap)})errs := r.Run(":8080")if errs != nil {panic(errs)}
}
localhost:8080/user/save?addressMap[c]=d&addressMap[d]=a
{"c": "d","d": "a"
}

结构体有map进行传递

type User struct {Id         int64             `form:"id"`Name       string            `form:"name"`Address    []string          `form:"address" binding:"required"`AddressMap map[string]string `form:"addressMap"`
}func main() {r := gin.Default()//r.Get("/hello")r.GET("/user/save", func(c *gin.Context) {var user Userc.ShouldBind(&user)user.AddressMap = c.QueryMap("addressMap")c.JSON(200, user)})_ = r.Run(":8080")}

表单参数传递

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body>
<form action="http://localhost:8080/form" method="post" action="application/x-www-form-urlencoded">用户名:<input type="text" name="username" placeholder="请输入你的用户
名">  <br>&nbsp;&nbsp;&nbsp;码:<input type="password" name="userpassword" placeholder="请输入你的密码">  <br><input type="submit" value="提交">
</form>
</body>
</html>

用一个表单进行参数传递

func main() {r := gin.Default()r.POST("/form", func(c *gin.Context) {types := c.DefaultPostForm("type", "post")username := c.PostForm("username")password := c.PostForm("userpassword")c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s,type:%s", username, password, types))})r.Run(":8080")
}

关于表单的其他参数

type User struct {Id         int64             `form:"id"`Name       string            `form:"name"`Address    []string          `form:"address" binding:"required"`AddressMap map[string]string `form:"addressMap"`
}func main() {r := gin.Default()//r.Get("/hello")r.POST("/user/save", func(c *gin.Context) {id := c.PostForm("id")name := c.PostForm("name")address := c.PostFormArray("address")addressMap := c.PostFormMap("addressMap")c.JSON(200, gin.H{"code":         200,"msg":          "success","id":           id,"name":         name,"addressMap":   addressMap,"addressSlice": address,})})r.Run(":8081")}

也可以用绑定获取表单传过来的参数

type User struct {Id         int64             `form:"id"`Name       string            `form:"name"`Address    []string          `form:"address" binding:"required"`AddressMap map[string]string `form:"addressMap"`
}func main() {r := gin.Default()//r.Get("/hello")r.POST("/user/save", func(c *gin.Context) {var user Userc.ShouldBind(&user)addressMap := c.PostFormMap("addressMap")user.AddressMap = addressMapc.JSON(200, user)})r.Run(":8081")}

也可以用json形式

type User struct {Id         int64             `form:"id" json:"id"`Name       string            `form:"name" json:"name"`Address    []string          `form:"address" binding:"required" json:"address"`AddressMap map[string]string `form:"addressMap" json:"addressMap"`
}func main() {r := gin.Default()r.POST("/user/save", func(c *gin.Context) {var user Userc.ShouldBindJSON(&user)c.JSON(200, user)})r.Run(":8081")
}

路径参数传递

在这里插入代码片

上传一个文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body>
<form action="http://localhost:8080/upload" method="POST" enctype="multipart/form-data"><input type="file" name="file" /><button type="submit">上传</button>
</form>
</body>
</html>

go代码


func main() {r := gin.Default()r.MaxMultipartMemory = 8 << 20 // 8 MBr.POST("/upload", func(c *gin.Context) {file, err := c.FormFile("file")if err != nil {log.Printf("上传文件时发生错误: %v", err)c.String(500, "上传图片出错: %v", err)return}// 检查文件类型if !strings.HasPrefix(file.Header.Get("Content-Type"), "image/") {c.String(400, "只允许上传图片文件")return}// 确保上传目录存在if err := os.MkdirAll("./uploads", os.ModePerm); err != nil {log.Printf("创建文件夹失败: %v", err)c.String(500, "创建文件夹失败: %v", err)return}// 保存文件savePath := "./uploads/" + file.Filenameif err := c.SaveUploadedFile(file, savePath); err != nil {log.Printf("保存文件时发生错误: %v", err)c.String(500, "保存文件出错: %v", err)return}c.String(http.StatusOK, "文件上传成功: %s", file.Filename)})r.Run(":8080")
}

上传特定文件

func main() {r := gin.Default()r.POST("/upload", func(c *gin.Context) {_, headers, err := c.Request.FormFile("file")if err != nil {log.Printf("Error when try yo get file:%v", err)}if headers.Size > 1024*1024*2 {fmt.Println("文件太大了...")return}if headers.Header.Get("Content-Type") != "image/png" {fmt.Println("只允许上传png图片")return}c.SaveUploadedFile(headers, "./video/"+headers.Filename)c.String(http.StatusOK, headers.Filename)})r.Run(":8080")
}

上传多个文件

func main() {r := gin.Default()r.MaxMultipartMemory = 8 << 20r.POST("/upload", func(c *gin.Context) {form, err := c.MultipartForm()if err != nil {c.String(http.StatusBadRequest, fmt.Sprintf("get error: %s", err.Error()))}//获取所有图片files := form.File["files"]//遍历所有图片for _, file := range files {if err := c.SaveUploadedFile(file, file.Filename); err != nil {c.String(http.StatusBadRequest, fmt.Sprintf("upload error:%s", err.Error()))return}}c.String(200, fmt.Sprintf("upload ok %d files", len(files)))})r.Run(":8000")
}

上传,对文件进行保存

type User struct {Id         int64             `form:"id" json:"id" uri:"id"`Name       string            `form:"name" json:"name" uri:"name"`Address    []string          `form:"address" binding:"required" json:"address" uri:"address"`AddressMap map[string]string `form:"addressMap" json:"addressMap" uri:"addressMap"`
}func main() {r := gin.Default()r.POST("/user/save/:id/:name", func(c *gin.Context) {form, err := c.MultipartForm()if err != nil {panic(err)}value := form.Valuefiles := form.Filefor _, fileArray := range files {for _, f := range fileArray {c.SaveUploadedFile(f, "./"+f.Filename)}}c.JSON(200, value)})r.Run(":8081")
}

routes group

路由组合

func main() {r := gin.Default()v1 := r.Group("/v1"){v1.GET("/login", login)v1.GET("submit", submit)}v2 := r.Group("/v2"){v2.POST("/login", login)v2.POST("/submit", submit)}r.Run(":8080")
}func login(c *gin.Context) {name := c.DefaultQuery("name", "jack")c.String(200, fmt.Sprintf("hello %s %s\n", name, name))
}func submit(c *gin.Context) {name := c.DefaultQuery("name", "lily")c.String(200, fmt.Sprintf("hello %s %s\n", name, name))
}

404 not found

func main() {r := gin.Default()r.GET("/user", func(c *gin.Context) {name := c.DefaultQuery("name", "枯藤")c.String(http.StatusOK, fmt.Sprintf("hello %s", name))})r.NoRoute(func(c *gin.Context) {c.String(http.StatusNotFound, "404 page not found222222222222")})r.Run(":8080")}

json数据解析和绑定


type Login struct {User     string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}func main() {//创建路由r := gin.Default()//json绑定r.POST("loginJSON", func(c *gin.Context) {var json Loginif err := c.ShouldBindJSON(&json); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}if json.User != "root" || json.Password != "123456" {c.JSON(http.StatusBadRequest, gin.H{"status": "304"})return}c.JSON(http.StatusOK, gin.H{"status": "200"})})r.Run(":8080")
}

表单数据解析和绑定


type Login struct {User     string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}func main() {//创建路由r := gin.Default()r.POST("/loginForm", func(c *gin.Context) {var form Loginif err := c.Bind(&form); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}if form.User != "root" || form.Password != "admin" {c.JSON(http.StatusBadRequest, gin.H{"error": "304"})return}c.JSON(http.StatusOK, gin.H{"status": "200"})})r.Run(":8080")}

url数据绑定

type Login struct {User     string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}func main() {r := gin.Default()//json绑定r.GET("/:user/:password", func(c *gin.Context) {var login Loginif err := c.ShouldBindUri(&login); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}//判断用户名密码是否正确if login.User != "root" || login.Password != "123456" {c.JSON(http.StatusBadRequest, gin.H{"error": "304"})return}c.JSON(http.StatusOK, gin.H{"message": "200"})})r.Run(":8080")}

各种数据格式的响应

func main() {//创建路由r := gin.Default()//1.jsonr.GET("/someJSON", func(c *gin.Context) {c.JSON(200, gin.H{"message": "someJSON", "status": 200})})//结构体响应r.GET("/someStruct", func(c *gin.Context) {var msg struct {Name    stringMessage stringNumber  int}msg.Name = "root"msg.Message = "message"msg.Number = 124c.JSON(200, msg)})r.GET("/someXML", func(c *gin.Context) {c.XML(200, gin.H{"message": "abc"})})//yaml响应r.GET("/someYAML", func(c *gin.Context) {c.YAML(200, gin.H{"message": "zhangsan"})})//5. protobuf 格式r.GET("/someProtobuf", func(c *gin.Context) {reps := []int64{int64(1), int64(2)}label := "label"data := &protoexample.Test{Label: &label,Reps:  reps,}c.ProtoBuf(200, data)})r.Run(":8080")
}

html模板渲染

目录:
在这里插入图片描述

func main() {//创建路由r := gin.Default()r.LoadHTMLGlob("tem/*")r.GET("/", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", gin.H{"title": "我是测试","ce":    "123456",})})r.Run(":8080")}

在这里插入图片描述

{{ define "user/index.html" }}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>{{.title}}</title>
</head>
<body>
fgkjdskjdsh{{.address}}
</body>
</html>
{{ end }}
func main() {//创建路由r := gin.Default()r.LoadHTMLGlob("tem/**/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "user/index.html", gin.H{"title":   "我是测试","address": "www.61mh.com",})})r.Run(":8080")}

模板嵌套
header.html

{{define "public/header"}}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{.title}}</title>
</head>
<body>{{end}}

footer.html

{{define "public/footer"}}
</body>
</html>
{{end}}

index.html

{{ define "user/index.html" }}
{{template "public/header" .}}
fgkjdskjdsh{{.address}}
{{template "public/footer" .}}
{{ end }}
func main() {//创建路由r := gin.Default()r.LoadHTMLGlob("tem/**/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "user/index.html", gin.H{"title":   "Goland Projects","address": "www.51mh.com",})})r.Run(":8080")}

静态资源文件进行渲染


func main() {r := gin.Default()//r.LoadHTMLFiles("./templates/index.tmpl", "./templates/user.tmpl")r.SetFuncMap(template.FuncMap{"safe": func(str string) template.HTML {return template.HTML(str)},})r.Static("/css", "./templates/css")r.LoadHTMLGlob("templates/**/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.tmpl", gin.H{"title": "<a href='http://www.baidu.com'>hello template</a>",})})r.GET("/user", func(c *gin.Context) {c.HTML(http.StatusOK, "user.tmpl", gin.H{"title": "<a href='http://www.baidu.com'>hello template</a>",})})r.Run(":8081")
}

模版取消转义

package mainimport ("github.com/gin-gonic/gin""html/template""net/http"
)func main() {r := gin.Default()//r.LoadHTMLFiles("./templates/index.tmpl", "./templates/user.tmpl")r.SetFuncMap(template.FuncMap{"safe": func(str string) template.HTML {return template.HTML(str)},})r.LoadHTMLGlob("templates/**/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.tmpl", gin.H{"title": "<a href='http://www.baidu.com'>hello template</a>",})})r.GET("/user", func(c *gin.Context) {c.HTML(http.StatusOK, "user.tmpl", gin.H{"title": "<a href='http://www.baidu.com'>hello template</a>",})})r.Run(":8081")
}

go重定向

func main() {//创建路由r := gin.Default()r.GET("/index", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")})r.Run(":8080")
}

cookie

设置cookie

c.SetCookie("site_cookie", "123456", 60*60*24, "/", "", false, false)

删除cookie

c.SetCookie("site_cookie", "123456", -1, "/", "", false, false)

读取cookie

data, err := c.Cookie("site_cookie")if err != nil {log.Println(err)c.JSON(200, err.Error())return}c.JSON(200, data)

多session

func main() {r := gin.Default()store := cookie.NewStore([]byte("secret"))sessionNames := []string{"a", "b"}r.Use(sessions.SessionsMany(sessionNames, store))r.GET("/hello", func(c *gin.Context) {sessionA := sessions.DefaultMany(c, "a")sessionB := sessions.DefaultMany(c, "b")if sessionA.Get("name") == nil {sessionA.Set("name", "b")sessionA.Save()}if sessionB.Get("name") == nil {sessionB.Set("name", "c")sessionB.Save()}})r.Run(":8081")
}

redis Session固化存储

func main() {r := gin.Default()store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))r.Use(sessions.Sessions("mysession", store))r.GET("/incr", func(c *gin.Context) {session := sessions.Default(c)var cnt intv := session.Get("count")if v == nil {cnt = 0} else {cnt = v.(int)cnt++}session.Set("count", cnt)session.Save()c.JSON(200, gin.H{"count": cnt,})})r.Run(":8080")

异步执行与同步执行

func main() {//创建路由r := gin.Default()//异步r.GET("/long_async", func(c *gin.Context) {//一个副本copyContext := c.Copy()go func() {time.Sleep(3 * time.Second)log.Println("异步执行:" + copyContext.Request.URL.Path)}()})//同步r.GET("/long_sync", func(c *gin.Context) {time.Sleep(3 * time.Second)log.Println("同步执行:" + c.Request.URL.Path)})r.Run(":8080")
}

中间件

在gin框架中,中间件是指可以拦截http请求-响应生命周期的特殊函数,在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间件执行完再轮到下一个中间件执行。

全局中间件

func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")c.Set("request", "中间件")status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {r := gin.Default()//注册中间价r.Use(MiddleWare())//{}代码规范{r.GET("/ce", func(c *gin.Context) {req, _ := c.Get("request")fmt.Println("request:", req)c.JSON(200, gin.H{"request": req})})}r.Run(":8080")
}

局部中间件


func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间开始执行了")c.Set("request", "中间剑")c.Next()status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {r := gin.Default()r.Use(MiddleWare()){r.GET("/ce", func(c *gin.Context) {req, _ := c.Get("request")fmt.Println("request:", req)c.JSON(200, gin.H{"request": req})})}r.Run(":8080")
}

定义两个路由,计算执行时间


func myTime(c *gin.Context) {start := time.Now()c.Next()since := time.Since(start)fmt.Println("程序用时:", since)
}func main() {r := gin.Default()//注册中间件r.Use(myTime)shoppingGroup := r.Group("/shopping"){shoppingGroup.GET("/index", shopIndexHandler)shoppingGroup.GET("/home", shopHomeHandler)}r.Run(":8080")}func shopIndexHandler(c *gin.Context) {time.Sleep(5 * time.Second)
}func shopHomeHandler(c *gin.Context) {time.Sleep(3 * time.Second)fmt.Println("how do you do?")
}

cookie的使用

func main() {r := gin.Default()r.GET("/cookie", func(c *gin.Context) {cookie, err := c.Cookie("key_code")if err != nil {cookie = "ThisIsCookie"c.SetCookie("key_code", "value_cookie", 60, "/","localhost", false, true)}fmt.Printf("cookie的值是:%s\n", cookie)})r.Run(":8080")
}

Cookie练习

func AuthMiddleWare() gin.HandlerFunc {return func(c *gin.Context) {if cookie, err := c.Request.Cookie("username"); err == nil {if cookie.String() == "123" {c.Next()return}}c.JSON(http.StatusUnauthorized, gin.H{"error": "error"})c.Abort()return}
}
func main() {r := gin.Default()r.GET("/login", func(c *gin.Context) {c.SetCookie("abc", "123", 60, "/", "localhost", false, true)c.String(200, "Login Success!")})r.GET("/home", AuthMiddleWare(), func(c *gin.Context) {c.JSON(200, gin.H{"data": "home"})})r.Run(":8080")
}

结构体验证

type Person struct {Age      int       `form:"age" binding:"required,gt=10"`Name     string    `form:"name" binding:"required"`Birthday time.Time `form:"birthday" time_format:"2006-01-02"` time_utc: "1"
}func main() {r := gin.Default()r.GET("/51mh", func(c *gin.Context) {var person Personif err := c.ShouldBind(&person); err != nil {c.String(500, fmt.Sprint(err))return}c.String(200, fmt.Sprintf("%#v", person))})r.Run(":8080")
}

结构体


type Login struct {User     string `uri:"user" validate:"checkName"`Password string `uri:"password"`
}func checkName(f1 validator.FieldLevel) bool {if f1.Field().String() != "root" {return false}return true
}func main() {r := gin.Default()validate := validator.New()r.GET("/:user/:password", func(c *gin.Context) {var login Loginerr := validate.RegisterValidation("checkName", checkName)if err := c.ShouldBindUri(&login); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}err = validate.Struct(login)if err != nil {for _, err := range err.(validator.ValidationErrors) {fmt.Println(err)}return}fmt.Println("success")})r.Run(":8080")}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter运行错误:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行&#xff0c;结果一直跑不起来&#xff0c;错误日志如下&#xff1a; 执行命令查看版本信息&#xff1a; flutter doctor --verbose通过输出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域&#xff0c;构建能够像人类一样理解、思考和行动的智能体&#xff08;AI Agent&#xff09;一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期&#xff0c;国内人工智能公司MiniMax重磅开源了其…

excel 列单元格合并(合并列相同行)

代码 首先自定义注解CellMerge&#xff0c;用于标记哪些属性需要合并&#xff0c;哪个是主键**&#xff08;这里做了一个优化&#xff0c;可以标记多个主键&#xff09;** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable适配达梦7 (2.1)

经过第一版的问题解决&#xff0c;后端项目可以启动&#xff0c;前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质&#xff1a;缩短首次可见帧渲染时间。 方法&#xff1a; iOS&#xff1a;利用Core ML本地模型轻量化部署&#xff0c;减少云端等待。Android&#xff1a;强制启用SplashScreen API&#xff0c;通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…

【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

红宝书第十三讲:详解JavaScript核心对象:Array、Object、Date、RegExp

红宝书第十三讲&#xff1a;详解JavaScript核心对象&#xff1a;Array、Object、Date、RegExp 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、Object&#xff1a;万物皆对象的“盒子” Object是JavaScript中…

昆仑技术重构AI大模型落地范式,长期作“加法”迎来国产生态化“拐点”

作者 | 曾响铃 文 | 响铃说 DeepSeek的爆火&#xff0c;在业内迅速掀起了一场国产化的变革。“国产大模型国产算力”软硬协同的范式正在被重构&#xff0c;AI产业国产化的含金量持续提升&#xff0c;越来越多的企业在这一趋势下加速走上数智化转型路径。 其中&#xff0c;以…

原开源鸿蒙仓库停止更新

2月24日&#xff0c;gitee 上的开源鸿蒙组织&#xff0c;所有代码停止更新&#xff0c;查看代码仓显示已关闭&#xff0c;不少小伙伴以为停止更新了&#xff0c;发生了什么&#xff1f; 原因很简单&#xff0c;所有代码仓迁移至 Gitcode&#xff0c;至于为什么改用 Gitcode&…

SpringBoot大学生竞赛管理系统设计与实现

一个用于管理大学生竞赛报名、信息查询与竞赛管理的系统&#xff0c;采用了现代化的SpringBoot框架进行开发。该系统的主要功能包括学生信息管理、教师信息管理、竞赛报名审核、竞赛信息管理等模块&#xff0c;适用于学校或教育机构进行竞赛活动的组织与管理。系统界面简洁&…

MinIO搭建部署

1、命令行安装 访问monio官网下载应用程序 # wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250228095516.0.0-1.x86_64.rpm -O minio.rpm # sudo dnf install minio.rpm # mkdir ~/minio # minio server ~/minio --console-address :90012、dock…

Linux修改SSH端口号

我这里那RedHat系列的操作系统举例,修改SSH端口号 修改SSH配置文件:/etc/ssh/sshd_config,将端口号修改为2222.vim /etc/ssh/sshd_config重启SSH服务systemctl restart sshd# 如果是比较旧的OS,使用下面的命令重启 service ssh restart验证端口更改是否成功netstat -tulnp …

【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目

目录 1. 功能需求2. Python基础2.1 特点2.2 Python基础知识2.3 dict嵌套简单说明 3. C语言调用Python3.1 搭建编译环境3.2 直接调用python语句3.3 调用无参python函数3.4 调用有参python函数 4. 阿里云垃圾识别方案4.1 接入阿里云4.2 C语言调用阿里云Python接口 5. 香橙派使用摄…

字节跳动实习生主导开发强化学习算法,助力大语言模型性能突破

目录 禹棋赢的背景与成就 主要成就 DAPO算法的技术细节 算法优势 禹棋赢的研究历程 关键时间节点 字节跳动的“Top Seed人才计划” 计划特点 小编总结 在大模型时代&#xff0c;经验不再是唯一的衡量标准&#xff0c;好奇心、执行力和对新技术的敏锐洞察力成为推动技术…

Rust + 时序数据库 TDengine:打造高性能时序数据处理利器

引言&#xff1a;为什么选择 TDengine 与 Rust&#xff1f; TDengine 是一款专为物联网、车联网、工业互联网等时序数据场景优化设计的开源时序数据库&#xff0c;支持高并发写入、高效查询及流式计算&#xff0c;通过“一个数据采集点一张表”与“超级表”的概念显著提升性能…

使用LangChain实现基于LLM和RAG的PDF问答系统

目录 前言一.大语言模型(LLM)1. 什么是LLM&#xff1f;2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain&#xff1f;1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …

群核科技持续亏损近18亿:营销费用偏高,市场份额优势面临挑战

《港湾商业观察》施子夫 2025年开年&#xff0c;DeepSeek的爆火让大众将目光聚焦到了“杭州六小龙”。其中&#xff0c;杭州群核信息技术有限公司&#xff08;以下简称&#xff0c;群核科技&#xff09;因系“六小龙”中首家启动上市的公司而被外界更多关注。 在此次递表港交…

java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp

演示&#xff1a; 微信小程序&#xff1a;嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色&#xff1a; 多商户、汽车单车一体、互联互通、移动管理端&#xff08;开发中&#xff09; 另…

音视频学习(三十):fmp4

FMP4&#xff08;Fragmented MP4&#xff09;是 MP4&#xff08;MPEG-4 Part 14&#xff09;的扩展版本&#xff0c;它支持流式传输&#xff0c;并被广泛应用于DASH&#xff08;Dynamic Adaptive Streaming over HTTP&#xff09;和HLS&#xff08;HTTP Live Streaming&#xf…

26考研——图_图的存储(6)

408答疑 文章目录 二、图的存储图的存储相关概念邻接矩阵存储方式邻接矩阵的定义顶点的度计算邻接矩阵的特点邻接矩阵的局限性 应用场景邻接矩阵的幂次意义&#xff08;了解即可&#xff09; 邻接表存储方式邻接表定义邻接表结构邻接表的特点 邻接矩阵和邻接表的适用性差异十字…