如何在 Goji 框架中正确获取 HTML GET 表单的参数值

本文讲解如何在 goji 微框架中处理 html get 表单提交,通过 `r.url.query().get()` 或 `r.formvalue()` 安全提取 url 查询参数,并给出完整可运行示例。

Goji 是一个轻量级 HTTP 路由框架,它本身不封装请求解析逻辑,而是直接基于 Go 标准库 net/http 构建。因此,处理表单(包括 GET 请求)需依赖标准 http.Request 的方法,而非框架专属 API。

要从 /?name=test 这类 GET 请求中提取 name 参数,推荐使用以下两种方式(均需先调用 r.ParseForm() 以确保表单数据已解析):

推荐方式:r.FormValue("name")
自动处理 GET 和 POST 表单,无需区分来源,且已做安全转义和空值容错:

package main

import (
    "fmt"
    "net/http"
    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"
)

func handleForm(w http.ResponseWriter, r *http.Request) {
    r.ParseForm() // 必须调用!否则 FormValue 返回空字符串
    name := r.FormValue("name")
    if name == "" {
        fmt.Fprint(w, "请输入姓名,或访问 首页")
        return
    }
    fmt.Fprintf(w, "你好,%s!你通过 GET 提交了表单。", name)
}

func main() {
    staticFilesLocation := "public"
    // 静态文件路由(/ → index.html)
    goji.Handle("/", http.FileServer(http.Dir(staticFilesLocation)))
    // 动态表单处理路由(必须显式注册,GET /?name=xxx 会命中此 handler)
    goji.Get("/form", handleForm) // 注意:index.html 中 form action 应设为 "/form"

    goji.Serve()
}

同时,修改 public/index.html 中的

,明确指定 action="/form"(否则默认提交到 /,仍由 FileServer 处理,无法进入 Go 逻辑):

Goji GET 表单示例

  

提交你的名字

⚠️ 关键注意事项:

立即学习“前端免费学习笔记(深入)”;

  • r.FormValue() 依赖 r.ParseForm() —— 即使是 GET 请求也必须显式调用,否则返回空字符串;
  • Goji 的 goji.Get("/path", handler) 仅匹配路径 /path,不匹配查询参数(如 /path?name=test 仍会进入该 handler);
  • 若未设置 action,浏览器默认提交到当前路径(即 /),此时 FileServer 会直接返回 index.html,不会触发任何 Go 逻辑
  • Goji 已于 2017 年停止维护,生产环境建议迁移到 gorilla/mux、chi 或标准 net/http 路由器;若坚持使用,请确保 github.com/zenazn/goji 版本兼容 Go 1.11+(需启用 Go modules)。

替代写法(更底层):

name := r.URL.Query().Get("name") // 不依赖 ParseForm,但无自动解码/容错

该方式跳过 ParseForm(),适合只读 GET 参数的简单场景,但无法处理 POST 数据,也不校验参数是否存在。

总结:在 Goji 中接收 GET 表单,本质是标准 HTTP 请求处理 —— 正确注册路由、显式解析表单、合理设置 HTML 表单 action,三者缺一不可。