gin的contex的设计

本文详细介绍了gin.Context中的核心组件,包括元数据管理、输入数据处理、路由变量解析、查询字符串参数处理、POST表单数据获取、文件操作、数据绑定、响应头设置、Cookie管理及渲染方法。这些组件为开发者提供了丰富的功能,极大提升了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gin.Context解析

gin.Context主要由下面几部分组成(这里沿用源代码里面的注释)

1. Metadata Management (我自己叫法:Key-Value)

这个模块比较简单, 就是从gin.Context中Set Key-Value, 以及各种各样的Get方法, 如GetBool, GetString等
实现这些功能也很简单, 其实就是一个map

 // Keys is a key/value pair exclusively for the context of each request.
    Keys map[string]interface{}

2. Input Data

这个模块相当重要了, gin的README基本上都在介绍这个模块的用法.

3. Param (路由变量)

gin的标准叫法是Parameters in path. restful风格api如/user/john, 这个路由在gin里面是/user/:name, 要获取john就需要使用Param函数

name := c.Param("name") 

这个方法实现也很简单, 就是在tree.go里面根据路由相关规则解析出来然后赋值给gin.Context的Params.

handlers, params, tsr := root.getValue(path, c.Params, unescape)

4. Query

/welcome?firstname=Jane&lastname=Doe这样一个路由, first, last即是Querystring parameters, 要获取他们就需要使用Query相关函数.

c.Query("first") // Jane
c.Query("last") // Doe

当然还有其他相关函数:- QueryMap- DefaultQuery 这个默认值的实现更加简单, 当QueryString中不包含这个值, 直接返回填入的值这些方法是的实现是利用net/http的Request的方法实现的

5. PostForm

对于POST, PUT等这些能够传递参数Body的请求, 要获取其参数, 需要使用PostForm

POST /user/1
{
    "name":manu,
    "message":this_is_great
 }
name := c.PostForm("name")
message := c.PostForm("message")

其他相关函数- DefaultPostForm
这些相关的方法是实现还是利用net/http的Request的方法实现的

6. FormFile

对于文件相关的操作, 一般生产情况下不建议这样使用, 因为把文件上传到服务器磁盘, 还得磁盘相关的监控. 我觉得最好利用云服务商相关的对象存储, 如:阿里云OSS, 七牛云对象存储, AWS的对象存储等来做文件的相关操作

7. Bind

内置的有json, xml, protobuf, form, query, yaml. 这些Bind极大的减少我们自己去解析各种个样的数据格式, 提高我们的开发速度

Bind的实现都在gin/binding里面. 这些内置的Bind都实现了Binding接口, 主要是Bind()函数.

context.BindJSON()    支持MIME为application/json的解析
context.BindXML()     支持MIME为application/xml的解析
context.BindYAML()    支持MIME为application/x-yaml的解析
context.BindQuery()   只支持QueryString的解析, 和Query()函数一样
context.BindUri()     只支持路由变量的解析
Context.Bind()     
支持所有的类型的解析, 这个函数尽量还是少用(当QueryString, PostForm, 
路由变量在一块同时使用时会产生意想不到的效果), 目前测试Bind不支持路由变量的解析,
Bind()函数的解析比较复杂, 这部分代码后面再看

8. Response### 对Header的支持

  • Header
  • GetHeader

这里的Header是写到Response里面的Header. 对于客户端发的请求的Header可以通过context.Request.Header.Get(“Content-Type”)获取

9. Cookie

提供对session, cookie的支持

10. render

做api常用到的其实就是gin封装的各种render. 目前支持的有:

func (c *Context) JSON(code int, obj interface{})
func (c *Context) Protobuf(code int, obj interface{})
func (c *Context) YAML(code int, obj interface{}) ...

当然我们可以自定义渲染, 只要实现func (c *Context) Render(code int, r render.Render)即可.
这里我们常用的是一个方法是:
gin.H{“error”: 111}. 这个结构相当实用, 各种render都支持. 其实这个结构很简单就是

type H map[string]interface{}, 

当我们要从map转换各种各样结构时, 不妨参考gin这里的代码Context说到这里基本就说完了, 这里介绍的方法都是开发中特别实用的方法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值