golangでWebサーバ - textarea編
目標:htmlのtextareaの入力を読み込んで表示する
目標はgolangを使ってhtmlのtextareaに入力された文字列を,送信ボタンが押されたら表示するという動作を実現します.
作成したコード
つくる
ファイル構成
. ├── css │ └── index.css ├── index.html └── main.go
静的なページindex.html
の作成
文字列を入力するためのtextarea
と送信ボタンsubmit
を表示するページを作ります.form
タグの action
にtestform
と設定することでtextarea
の文字列が/testform
に送信されます.
index.html
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>Hello World!</title> <link rel="stylesheet" type="text/css" href="css/index.css?201906061"> </head> <html> <body> <header> <h1>Hello World!</h1> </header> <div class="main"> <form action="testform" method="post"> <textarea name="textarea"></textarea> <input type="submit" value="送信"> </form> </div> </body> </html>
css/index.css
見た目を変えるためにCSSも作っておきます.golangのコード内にCSSファイルを読み込むために設定する必要があります.これでhtmlファイルのheadに書いたcss/index.css
を読み込むことができるようになります.
http.Handle("/css/", http.StripPrefix("/css/", http.FileServer(http.Dir("css"))))
メインページ
http.HandleFunc
の引数で関数をマップできます.
http.HandleFunc("/", handler)
これでlocalhost:[ポート番号]/
にアクセスすると,登録したhandler
という関数が実行されます.
次に,handler
関数でindex.html
を読み込んで送信できるようにします.http.HandleFunc
に登録する関数の引数はhttp.ResponseWrite
という型の値w
と*http.Request
という型のr
の2つ.w
にはHTTPレスポンスの情報を書き込みます.r
からはHTTPリクエストの情報が入っています.
htmlを表示するためにtemplate
というライブラリを使います.これでhtmlファイルの内容をw
に書き込むことができます.
func handler(w http.ResponseWriter, r *http.Request) { tmpl := template.Must(template.ParseFiles("index.html")) if err := tmpl.ExecuteTemplate(w, "index.html", nil); err != nil { log.Fatal(err) } }
POSTメソッド
次に,送信ボタンを押したときにtextarea
の値を読み取って,それをそのまま返すという処理をします.
先ほどと同様にmain関数で,handlerをマップします.今回,送信ボタンを押してaction=testform
のため,/testform
にtest_post
関数をマップしています.
http.HandleFunc("/testform", test_post)
次に,test_post
関数の中身を実装します.
index.html
に記述した<textarea name=textarea></textarea>
に入力された文字列はr.FormValue("textarea")
で読み取ることができます.FormValue
の引数にはname属性の値を与えています. これをtext
という変数に格納しています.さらに,fmt.Fprintf
でw
にtext
をそのまま書き込んでいます.これでブラウザにtext
が表示されます.
func test_post(w http.ResponseWriter, r *http.Request) { text := r.FormValue("textarea") fmt.Fprintf(w, text) }
サーバ起動
次に,localhost:[ポート番号]
にブラウザでアクセスしたときにindex.html
を表示できるようにする.
ポート番号は環境変数PORT
から読み取ることにします.環境変数PORT
をos.Getenv("PORT")
で読み取れます.
読み取った環境変数はstring型なので,ポート番号をint型としてportという変数に格納します.
port, _ := strconv.Atoi(os.Getenv("PORT"))
次にサーバを起動します.
http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
これで一通りの実装が終わりです.
実行
env
コマンドを使って環境変数PORT
に値を設定してからmain.go
を実行します.
env PORT=5000 go run main.go
上記のコマンドでサーバを立ち上げてlocalhost:5000/にブラウザでアクセスします.