
本文讲解如何在 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 中的
⚠️ 关键注意事项:
立即学习“前端免费学习笔记(深入)”;
- 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,三者缺一不可。











