一架梯子,一头程序猿,仰望星空!
Iris Web框架教程 > 内容正文

Go Iris参数处理


本章介绍iris框架路由GET、POST等请求参数的获取方式,包括cookie的读写

路径中的参数

func main() {
    app := iris.Default()

    // 这个处理程序将匹配 /user/john ,但不匹配 /user/ 或 /user
    app.Get("/user/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.Writef("你好 %s", name)
    })

    // 然而,这个处理程序将匹配 /user/john/ 以及 /user/john/send
    // 如果没有其他路由器匹配 /user/john,则会重定向到 /user/john/
    app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        action := ctx.Params().Get("action")
        message := name + "正在" + action
        ctx.WriteString(message)
    })

    // 对于每个匹配的请求,上下文都将保存路由器定义
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
    })

    app.Listen(":8080")
}

内置可用的参数类型:

参数类型 Go类型 验证 获取帮助函数
:string string 任意内容(单个路径段) Params().Get
:uuid string uuidv4或v1(单个路径段) Params().Get
:int int -9223372036854775808到9223372036854775807(x64)或-2147483648到2147483647(x32),取决于主机架构 Params().GetInt
:int8 int8 -128到127 Params().GetInt8
:int16 int16 -32768到32767 Params().GetInt16
:int32 int32 -2147483648到2147483647 Params().GetInt32
:int64 int64 -9223372036854775808到9223372036854775807 Params().GetInt64
:uint uint 0到18446744073709551615(x64)或0到4294967295(x32),取决于主机架构 Params().GetUint
:uint8 uint8 0到255 Params().GetUint8
:uint16 uint16 0到65535 Params().GetUint16
:uint32 uint32 0到4294967295 Params().GetUint32
:uint64 uint64 0到18446744073709551615 Params().GetUint64
:bool bool “1”或”t”或”T”或”TRUE”或”true”或”True”或”0”或”f”或”F”或”FALSE”或”false”或”False” Params().GetBool
:alphabetical string 小写或大写字母 Params().Get
:file string 小写或大写字母,数字,下划线(_),短横线(-),点(.),不能包含空格或其他非有效文件名的特殊字符 Params().Get
:path string 任意内容,可以用斜杠(路径段)分隔,但应该是路由路径的最后一部分 Params().Get
:mail string 电子邮件地址,不进行域验证 Params().Get
:email string 电子邮件地址,进行域验证 Params().Get
:date string yyyy/mm/dd 格式,例如 /blog/{param:date} 匹配 /blog/2022/04/21 Params().GetTimeParams().SimpleDate
:weekday uint (0-6) 或 string 字符串需要是 time.Weekday 常量(”sunday” 到 “monday” 或 “Sunday” 到 “Monday”)格式,例如 /schedule/{param:weekday} 匹配 /schedule/monday Params().GetWeekday

获取Query参数

func main() {
    app := iris.Default()

    // 使用现有的底层请求对象解析查询字符串参数。
    // 请求响应的 URL 匹配为:/welcome?firstname=Jane&lastname=Doe
    app.Get("/welcome", func(ctx iris.Context) {
        firstname := ctx.URLParamDefault("firstname", "Guest")
        lastname := ctx.URLParam("lastname") // ctx.Request().URL.Query().Get("lastname") 的捷径

        ctx.Writef("你好 %s %s", firstname, lastname)
    })
    app.Listen(":8080")
}

获取表单参数

func main() {
    app := iris.Default()

    app.Post("/form_post", func(ctx iris.Context) {
        message := ctx.PostValue("message")
        nick := ctx.PostValueDefault("nick", "匿名")

        ctx.JSON(iris.Map{
            "status":  "已发布",
            "message": message,
            "nick":    nick,
        })
    })
    app.Listen(":8080")
}

综合例子Query + 表单参数

POST /post?id=1234&page=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded

name=kataras&message=this_is_great
func main() {
    app := iris.Default()

    app.Post("/post", func(ctx iris.Context) {
        id, err := ctx.URLParamInt("id", 0)
        if err != nil {
            ctx.StopWithError(iris.StatusBadRequest, err)
            return
        }

        page := ctx.URLParamIntDefault("page", 0)
        name := ctx.PostValue("name")
        message := ctx.PostValue("message")

        ctx.Writef("id: %d; page: %d; name: %s; message: %s", id, page, name, message)
    })
    app.Listen(":8080")
}
id: 1234; page: 1; name: kataras; message: this_is_great

在POST请求中读取Query参数

POST /post?id=a&id=b&id=c&name=john&name=doe&name=kataras
Content-Type: application/x-www-form-urlencoded
func main() {
    app := iris.Default()

    app.Post("/post", func(ctx iris.Context) {

        ids := ctx.URLParamSlice("id")
        names, err := ctx.PostValues("name")
        if err != nil {
            ctx.StopWithError(iris.StatusBadRequest, err)
            return
        }

        ctx.Writef("ids: %v; names: %v", ids, names)
    })
    app.Listen(":8080")
}
ids: [a b c], names: [john doe kataras]
import "github.com/kataras/iris/v12"

func main() {
    app := iris.Default()

    app.Get("/cookie", func(ctx iris.Context) {
        // 读取cookie
        value := ctx.GetCookie("my_cookie")

        if value == "" {
            value = "NotSet"
            // 创建cookie
            ctx.SetCookieKV("my_cookie", value)
            // Alternatively: ctx.SetCookie(&http.Cookie{...})
            // 创建cookie
            ctx.SetCookie("", "test", 3600, "/", "localhost", false, true)
        }

        ctx.Writef("Cookie value: %s \n", cookie)
    })

    app.Listen(":8080")
}