DRYな備忘録

Don't Repeat Yourself.

HTMLのformタグのaction属性にqueryパラメータを設置したが、サーバ側で取得できていない

問題

クライアント(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が再構築される。

stackoverflow.com

解決

  • 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な備忘録として