请求参数(一):r.Get/r.GetQuery/r.GetForm 等获取方式

引言

HTTP 请求的参数可能来自 URL 查询串、表单体、路由路径等。GoFrame 把读取入口统一放在请求对象 *ghttp.Request 上,本章介绍最常用的几个方法。

概念

在 v2 的请求输入体系中(官方文档 goframe.org 的请求输入章节),常用方法有:

  • r.Get(key, def...):通用获取,框架按既定优先级在各类参数中查找(包含路由参数、Query、Form 等,具体范围与优先级以官方文档为准)。
  • r.GetQuery(key, def...):只从 URL 查询串中获取。
  • r.GetForm(key, def...):只从表单(含 multipart)中获取。
  • 返回类型:以上方法都返回 *gvar.Var,可调用 .String().Int().Bool() 等完成类型转换;带默认值写法如 r.Get("page", 1),参数缺失时返回默认值。

代码示例

在一个 POST 接口里分别演示三种取法:

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
	s := g.Server()

	s.Group("/user", func(group *ghttp.RouterGroup) {
		// GET /user/search?keyword=gf&page=2
		group.GET("/search", func(r *ghttp.Request) {
			keyword := r.Get("keyword")          // 通用获取
			page := r.GetQuery("page", 1).Int()  // 只取 Query,带默认值
			r.Response.WriteJson(g.Map{
				"keyword": keyword.String(),
				"page":    page,
			})
		})

		// POST /user/create  表单体: name=john&age=20
		group.POST("/create", func(r *ghttp.Request) {
			name := r.GetForm("name") // 只取表单体
			age := r.GetForm("age", 0).Int()
			r.Response.WriteJson(g.Map{
				"name": name.String(),
				"age":  age,
			})
		})
	})

	s.SetPort(8000)
	s.Run()
}

测试一下:

curl "http://127.0.0.1:8000/user/search?keyword=gf&page=2"
curl -d "name=john&age=20" "http://127.0.0.1:8000/user/create"

gvar.Var 的转换方法很实用,例如 r.Get("enabled").Bool() 可把 "true"/"1"/"on" 等字符串归一化为布尔值。

注意点

  • 参数不存在时 Var 为空值而不是 nil.String() 返回空串,配合默认值参数更稳妥。
  • 同名参数出现多次时(如 ?tag=a&tag=b),默认取第一个,数组形态可用对应的 Array/Map 系列方法(方法清单以官方文档为准)。
  • 路由路径上的参数(如 /user/:id)也可通过 r.Get 系列拿到,属路由参数来源。
  • 参数值本质是字符串,转成目标类型前注意边界(如空串转 Int 会得到 0)。

小结

r.Get 一把抓、r.GetQuery/r.GetForm 按来源取,配合 gvar.Var 的类型转换,单值参数的读取已够用。参数一多,逐个 Get 就繁琐了——下一章介绍用结构体一次性接收全部参数。

笔记加载中…