問題
クライアント(HTML)側
<form method="GET" action="/form/submit?nickname=otiai10"> <input type="submit" value="送信" /> </form>
サーバ(Go)側
func HandleFormSubmit(w http.ResponseWriter, req *http.Request) { fmt.Fprintf("nickname: %s", req.URL.Query().Get("nickname")) }
ブラウザで見える出力
nickname:
つまり来てない。
検証方法
- ブラウザのURL欄に直で、
https://自サーバ/form/submit?nickname=otiai10
と入力して訪問。するとブラウザでは
nickname: otiai10
と表示される
原因
formタグをGETメソッドで使用するとき、action属性に付加する ?nickname=otiai10
などのqueryパラメータは送信時に無視され、inputタグを見てparameterが再構築される。
解決
- action属性の中でqueryを使うな
- inputタグ(e.g. type="hidden")を使え
- <form method="GET" action="/form/submit?name=otiai10"> + <form method="GET" action="/form/submit"> + <input type="hidden" name="nickname" value="otiai10" /> <input type="submit" value="送信" /> </form>
雑感
- input[type=hidden]なんて久しぶりに書いた。
- 上記は検証用ゆえに、form[method=GET]を使っていたり、任意の入力値をサニタイズせずにブラウザに表示したりしており、商用コードとしては問題あるので、ご注意ください。
- 世の中はAIだのブロックチェーンだの言っているが、俺はまだ世界の片隅でHTMLを書いてる...
DRYな備忘録として