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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 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 签约作者,欢迎关注我分享更多干货!


目录
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
探索Gorm - Golang流行的数据库ORM框架
探索Gorm - Golang流行的数据库ORM框架
|
4月前
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
33 2
|
4月前
|
负载均衡 监控 Go
使用Golang框架构建分布式系统
本文探讨了使用Golang构建分布式系统的方法。Golang因其高效、简洁的语法和并发支持成为理想的开发语言。文中列举了几个常用的Golang框架,如Echo、Gin、gRPC和NATS等,并强调了服务拆分、通信机制、负载均衡等构建分布式系统的关键要素。通过选择合适的框架,遵循需求分析、技术选型、服务设计等步骤,开发者可以构建出高性能、高可用和可扩展的系统。此外,文中还提供了一个使用gRPC和etcd的简单代码案例来说明实现过程。
189 4
|
13天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
1月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
3月前
|
JSON 中间件 Go
Go语言Web框架Gin介绍
【7月更文挑战第19天】Gin是一个功能强大、高性能且易于使用的Go语言Web框架。它提供了路由、中间件、参数绑定等丰富的功能,帮助开发者快速构建高质量的Web应用。通过本文的介绍,你应该对Gin框架有了初步的了解,并能够使用它来开发简单的Web服务。随着你对Gin的深入学习和实践,你将能够利用它构建更复杂、更强大的Web应用。
|
2月前
|
关系型数据库 API Go
[golang]在Gin框架中使用JWT鉴权
[golang]在Gin框架中使用JWT鉴权
|
2月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
|
5月前
|
安全 Go 开发者
Golang深入浅出之-Go语言中的CSP模型:深入理解并发哲学
【5月更文挑战第2天】Go语言的并发编程基于CSP模型,强调通过通信共享内存。核心概念是goroutines(轻量级线程)和channels(用于goroutines间安全数据传输)。常见问题包括数据竞争、死锁和goroutine管理。避免策略包括使用同步原语、复用channel和控制并发。示例展示了如何使用channel和`sync.WaitGroup`避免死锁。理解并发原则和正确应用CSP模型是编写高效安全并发程序的关键。
124 7
|
5月前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
210 1