此页面提供了 Gin 框架中处理 HTTP 请求的全面指南。它涵盖了 Gin 如何接收和处理请求、如何访问请求数据以及如何将请求中的数据绑定到 Go 结构体。有关响应生成,请参阅 响应渲染。
当请求到达 Gin 应用程序时,在将响应发送回客户端之前,它会经历几个阶段。理解这个流程对于有效的请求处理至关重要。
来源: context.go184-196 context.go198-216
Context 是请求处理过程中的核心对象。它封装了 HTTP 请求和响应对象,提供了访问请求数据的方法,并包含用于流程控制的实用工具。
来源: context.go55-93
Gin 提供了多种方法来通过 Context 对象访问不同类型的请求数据。
路径参数在路由路径中定义,并从 URL 段捕获。例如,在像 /user/:id 这样的路由中,id 是一个路径参数。
查询参数是 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") |
对于 POST、PUT 和 PATCH 请求,带有 application/x-www-form-urlencoded 或 multipart/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") |
用于处理 multipart 表单数据中的文件上传
用于多个文件
访问原始请求体数据
Gin 最强大的功能之一是能够自动将请求数据绑定到 Go 结构体。
来源: binding/binding.go92-116 context.go708-748
Gin 提供了两类绑定方法
Must Bind 方法 - 如果绑定失败,将中止请求并返回 400 错误
Bind, BindJSON, BindXML, BindQuery, BindYAML, BindHeader, BindTOML, BindUriShould Bind 方法 - 返回错误,允许您自行处理
ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery, ShouldBindYAML, ShouldBindHeader, ShouldBindTOML, ShouldBindUriBind 和 ShouldBind 方法会根据 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() 方法用于控制此流程。
要停止处理并跳过剩余的处理程序,请使用 abort 方法
Gin 提供了一个机制来收集请求处理过程中的错误
Gin 提供访问客户端信息的方法
Gin 允许您在请求上下文中存储数据
Gin 中的请求处理围绕 Context 对象进行,该对象提供了访问请求数据、将其绑定到结构体以及控制请求处理流程的方法。理解这些概念可以帮助您使用 Gin 创建高效且健壮的 Web 应用程序。
请求处理流程遵循清晰的路径:请求由 Engine 接收,匹配到路由,通过中间件处理,最终由路由处理程序处理,然后将响应发送回客户端。