如何在 Go 的 HTTP 处理函数中获取表单提交按钮的值

7次阅读

如何在 Go 的 HTTP 处理函数中获取表单提交按钮的值

go Web 开发中,可通过为 添加 name 属性,使其在 POST 提交时作为标准表单字段参与请求;随后调用 r.FormValue(“name”) 即可安全获取被点击按钮的 value 值,无需 JavaScript 或隐藏字段。

go web 开发中,可通过为 `

在 HTML 表单中,多个

因此,正确做法是统一为提交按钮指定相同的 name(例如 “submit”),并赋予不同 value:

<form action="/save" method="POST">   <div>     <span>Title: </span>     <textarea name="title" placeholder="Link">{{printf "%s" .Title}}</textarea>   </div>   <div>     <button type="submit" name="submit" value="submit1">保存为草稿</button>     <button type="submit" name="submit" value="submit2">立即发布</button>   </div> </form>

在 Go 的 http 处理函数中,只需调用 r.FormValue(“submit”) 即可获取用户点击的按钮值:

func saveHandler(w http.ResponseWriter, r *http.Request) {   if r.Method != "POST" {     http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)     return   }    // 解析表单(自动调用 ParseForm,支持 application/x-www-form-urlencoded 和 multipart/form-data)   if err := r.ParseForm(); err != nil {     http.Error(w, "Invalid form data", http.StatusBadRequest)     return   }    title := r.FormValue("title")   submitAction := r.FormValue("submit") // ✅ 关键:通过 name 获取 button 的 value    switch submitAction {   case "submit1":     log.Printf("Received draft submission: %s", title)     // 处理“保存为草稿”逻辑   case "submit2":     log.Printf("Received publish submission: %s", title)     // 处理“立即发布”逻辑   default:     http.Error(w, "Unknown submit action", http.StatusBadRequest)     return   }    http.Redirect(w, r, "/", http.StatusSeeOther) }

⚠️ 注意事项:

  • 必须设置 name:仅设 value 而无 name 的
  • r.FormValue 是安全的:它内部自动调用 r.ParseForm()(若未手动解析),且对不存在的 key 返回空字符串,无需额外判空(但业务逻辑中建议显式校验);
  • 避免使用 type=”image” 或 混用:若需坐标或兼容旧浏览器,应统一方案;现代场景推荐
  • csrf 防护建议:生产环境应在表单中加入一次性 Token(如 csrf.Token(r)),并在 handler 中验证,防止跨站请求伪造。

该方法简洁、标准、零依赖,完全符合 HTTP 表单语义,是 Go Web 开发中识别多提交按钮意图的推荐实践。

text=ZqhQzanResources