Golang Gin 框架之模型绑定(八)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。上一篇文章我们介绍了 Gin 框架日志管理模块的相关内容,今天我们就来详细看一看 Gin 在模型绑定方面的内容。

目录

  • 前言
  • 正文
  • 结尾

前言

Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。上一篇文章我们介绍了 Gin 框架日志管理模块的相关内容,今天我们就来详细看一看 Gin 在模型绑定方面的内容。

正文

很多和服务器对接的小伙伴,一般都会有这样的疑问:服务器端如何读懂来自客户端的请求?其实,这就需要我们提前定义好 API 接口和消息结构体。其中,API 接口非常好理解,就是我们一般说的消息路由,比如 /ping、/v1/upload 等。那么消息结构体是什么呢?就是我们定义的请求参数类型。这也就是我们今天要讨论的内容,为了更好的解析这些请求参数,Gin 框架设计了参数模型绑定机制,可以非常方便的完成请求参数的解析。

目前,Gin 框架支持四种形式的模型绑定,分别是 JSON, XML, YAML 和标准格式 (比如,foo=bar&boo=baz)。当服务器端需要绑定某种形式时,需要提前定义。比如如果想使用 JSON 类型解析参数 name,就需要提前声明 json:"name"

下面看一段代码实例:

// Binding from JSONtypeLoginstruct {
Userstring`form:"user" json:"user" xml:"user"  binding:"required"`Passwordstring`form:"password" json:"password" xml:"password" binding:"required"`}
funcmain() {
router :=gin.Default()
// 绑定 JSON 类型参数 ({"user": "manu", "password": "123"})router.POST("/loginJSON", func(c*gin.Context) {
varjsonLoginiferr :=c.ShouldBindJSON(&json); err!=nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return        }
ifjson.User!="manu"||json.Password!="123" {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
return        } 
c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    })
// Example for binding XML (//  <?xml version="1.0" encoding="UTF-8"?>//  <root>//      <user>user</user>//      <password>123</password>//  </root>)router.POST("/loginXML", func(c*gin.Context) {
varxmlLoginiferr :=c.ShouldBindXML(&xml); err!=nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return        }
ifxml.User!="manu"||xml.Password!="123" {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
return        } 
c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    })
// 绑定 HTML 形式的参数 (user=manu&password=123)router.POST("/loginForm", func(c*gin.Context) {
varformLogin// This will infer what binder to use depending on the content-type header.iferr :=c.ShouldBind(&form); err!=nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return        }
ifform.User!="manu"||form.Password!="123" {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
return        } 
c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    })
// 启动服务并监听 8080 端口router.Run(":8080")
}

此外,在进行参数模型绑定时,Gin 还提供了两组绑定方法MustBindWithShouldBindWith,一种是必须绑定模式,一种是应该绑定模式。前者在发生解析错误时,会直接触发错误返回,后者需要开发者自己进行错误处理。相关的方法如下所示: 必须绑定模式有 Bind,  BindJSON,  BindXML,  BindQuery,  BindYAML,应该绑定模式有ShouldBind,  ShouldBindJSON,  ShouldBindXML,  ShouldBindQuery,  ShouldBindYAML

结尾

好了,今天关于 Gin 框架解析参数模型绑定机制的内容就介绍这么多,如果感兴趣的话,就自己动手是不是吧!希望今天介绍的内容能够帮助到大家,明天再见。



作者简介:大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,同时也是CSDN博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!


目录
相关文章
|
24天前
|
存储 安全 测试技术
GoLang协程Goroutiney原理与GMP模型详解
本文详细介绍了Go语言中的Goroutine及其背后的GMP模型。Goroutine是Go语言中的一种轻量级线程,由Go运行时管理,支持高效的并发编程。文章讲解了Goroutine的创建、调度、上下文切换和栈管理等核心机制,并通过示例代码展示了如何使用Goroutine。GMP模型(Goroutine、Processor、Machine)是Go运行时调度Goroutine的基础,通过合理的调度策略,实现了高并发和高性能的程序执行。
78 29
|
15天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
22天前
|
负载均衡 算法 Go
GoLang协程Goroutiney原理与GMP模型详解
【11月更文挑战第4天】Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,创建和销毁开销小,适合高并发场景。其调度采用非抢占式和协作式多任务处理结合的方式。GMP 模型包括 G(Goroutine)、M(系统线程)和 P(逻辑处理器),通过工作窃取算法实现负载均衡,确保高效利用系统资源。
|
6月前
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
55 2
|
6月前
|
负载均衡 监控 Go
使用Golang框架构建分布式系统
本文探讨了使用Golang构建分布式系统的方法。Golang因其高效、简洁的语法和并发支持成为理想的开发语言。文中列举了几个常用的Golang框架,如Echo、Gin、gRPC和NATS等,并强调了服务拆分、通信机制、负载均衡等构建分布式系统的关键要素。通过选择合适的框架,遵循需求分析、技术选型、服务设计等步骤,开发者可以构建出高性能、高可用和可扩展的系统。此外,文中还提供了一个使用gRPC和etcd的简单代码案例来说明实现过程。
277 4
|
3月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
3月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
5月前
|
JSON 中间件 Go
Go语言Web框架Gin介绍
【7月更文挑战第19天】Gin是一个功能强大、高性能且易于使用的Go语言Web框架。它提供了路由、中间件、参数绑定等丰富的功能,帮助开发者快速构建高质量的Web应用。通过本文的介绍,你应该对Gin框架有了初步的了解,并能够使用它来开发简单的Web服务。随着你对Gin的深入学习和实践,你将能够利用它构建更复杂、更强大的Web应用。
|
4月前
|
关系型数据库 API Go
[golang]在Gin框架中使用JWT鉴权
[golang]在Gin框架中使用JWT鉴权
106 0
|
4月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
111 0