菜单

请求处理

相关源文件

此页面提供了 Gin 框架中处理 HTTP 请求的全面指南。它涵盖了 Gin 如何接收和处理请求、如何访问请求数据以及如何将请求中的数据绑定到 Go 结构体。有关响应生成,请参阅 响应渲染

请求处理流程

当请求到达 Gin 应用程序时,在将响应发送回客户端之前,它会经历几个阶段。理解这个流程对于有效的请求处理至关重要。

来源: context.go184-196 context.go198-216

Context 对象

Context 是请求处理过程中的核心对象。它封装了 HTTP 请求和响应对象,提供了访问请求数据的方法,并包含用于流程控制的实用工具。

来源: context.go55-93

访问请求数据

Gin 提供了多种方法来通过 Context 对象访问不同类型的请求数据。

路径参数

路径参数在路由路径中定义,并从 URL 段捕获。例如,在像 /user/:id 这样的路由中,id 是一个路径参数。

来源: context.go474-476

查询参数

查询参数是 URL 中 ? 字符后面的键值对。

方法描述示例
Query(key)返回参数的值c.Query("search")
DefaultQuery(key, defaultValue)如果不存在则返回默认值c.DefaultQuery("page", "1")
GetQuery(key)返回值以及一个表示其是否存在的布尔值val, exists := c.GetQuery("filter")
QueryArray(key)返回一个参数的所有值,该参数出现多次c.QueryArray("tags")
QueryMap(key)返回一个 map,用于具有数组类语法的参数c.QueryMap("filters")

来源: context.go496-568

表单数据

对于 POST、PUT 和 PATCH 请求,带有 application/x-www-form-urlencodedmultipart/form-data 内容类型。

方法描述示例
PostForm(key)返回表单参数的值c.PostForm("username")
DefaultPostForm(key, defaultValue)如果不存在则返回默认值c.DefaultPostForm("role", "user")
GetPostForm(key)返回值以及一个表示其是否存在的布尔值val, exists := c.GetPostForm("email")
PostFormArray(key)返回一个参数的所有值,该参数出现多次c.PostFormArray("interests")
PostFormMap(key)返回一个 map,用于具有数组类语法的参数c.PostFormMap("attributes")

来源: context.go570-641

文件上传

用于处理 multipart 表单数据中的文件上传

用于多个文件

来源: context.go659-707

请求头部

来源: context.go994-996

原始请求体

访问原始请求体数据

来源: context.go998-1004

数据绑定

Gin 最强大的功能之一是能够自动将请求数据绑定到 Go 结构体。

来源: binding/binding.go92-116 context.go708-748

绑定方法

Gin 提供了两类绑定方法

  1. Must Bind 方法 - 如果绑定失败,将中止请求并返回 400 错误

    • Bind, BindJSON, BindXML, BindQuery, BindYAML, BindHeader, BindTOML, BindUri
  2. Should Bind 方法 - 返回错误,允许您自行处理

    • ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery, ShouldBindYAML, ShouldBindHeader, ShouldBindTOML, ShouldBindUri

来源: context.go718-888

自动内容类型选择

BindShouldBind 方法会根据 Content-Type 头自动选择合适的绑定方法。

来源: context.go718-721 binding/binding.go92-116

绑定示例

JSON 绑定

表单绑定

URI 绑定

来源: context.go718-888 binding/binding.go92-116

绑定标签

绑定系统使用标签来控制数据如何映射到结构体字段

  • json:"field_name" - 绑定 JSON 数据
  • xml:"field_name" - 绑定 XML 数据
  • form:"field_name" - 绑定表单数据
  • uri:"field_name" - 绑定 URI 参数
  • header:"field_name" - 绑定请求头
  • binding:"required" - 字段必须存在且不能为空
  • binding:"email" - 字段必须是有效的电子邮件
  • time_format:"2006-01-02" - 解析时间字段的格式
  • time_utc:"1" - 以 UTC 解析时间
  • time_location:"Asia/Shanghai" - 解析时间的时区
  • default:"value" - 如果字段未提供,则为默认值
  • collection_format:"csv" - 数组的格式(csv, ssv, tsv, pipes, multi)

来源: binding/form_mapping.go144-173 binding/form_mapping_test.go287-324

请求流程控制

Gin 提供了通过中间件和处理程序控制请求处理流程的机制。

处理程序链执行

请求通过一系列处理程序(中间件和路由处理程序)进行处理。Next() 方法用于控制此流程。

来源: context.go184-196

中止请求处理

要停止处理并跳过剩余的处理程序,请使用 abort 方法

来源: context.go198-231

错误处理

Gin 提供了一个机制来收集请求处理过程中的错误

来源: context.go238-259

客户端信息

Gin 提供访问客户端信息的方法

来源: context.go890-958

请求数据存储

Gin 允许您在请求上下文中存储数据

来源: context.go265-459

总结

Gin 中的请求处理围绕 Context 对象进行,该对象提供了访问请求数据、将其绑定到结构体以及控制请求处理流程的方法。理解这些概念可以帮助您使用 Gin 创建高效且健壮的 Web 应用程序。

请求处理流程遵循清晰的路径:请求由 Engine 接收,匹配到路由,通过中间件处理,最终由路由处理程序处理,然后将响应发送回客户端。