golangでWebサーバ - textarea編

目標:htmlのtextareaの入力を読み込んで表示する

目標はgolangを使ってhtmlのtextareaに入力された文字列を,送信ボタンが押されたら表示するという動作を実現します.

作成したコード

github.com

つくる

ファイル構成

.
├── css
│   └── index.css
├── index.html
└── main.go

静的なページindex.htmlの作成

文字列を入力するためのtextareaと送信ボタンsubmitを表示するページを作ります.formタグの actiontestformと設定することで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のため,/testformtest_post関数をマップしています.

http.HandleFunc("/testform", test_post)

次に,test_post関数の中身を実装します.

index.htmlに記述した<textarea name=textarea></textarea>に入力された文字列はr.FormValue("textarea")で読み取ることができます.FormValueの引数にはname属性の値を与えています. これをtextという変数に格納しています.さらに,fmt.Fprintfwtextをそのまま書き込んでいます.これでブラウザにtextが表示されます.

func test_post(w http.ResponseWriter, r *http.Request) {
    text := r.FormValue("textarea")
    fmt.Fprintf(w, text)
}

サーバ起動

次に,localhost:[ポート番号]にブラウザでアクセスしたときにindex.htmlを表示できるようにする.

ポート番号は環境変数PORTから読み取ることにします.環境変数PORTos.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/にブラウザでアクセスします.

f:id:soyukke:20190606222943p:plain
textareaに文字列を入力して送信ボタンを押すと...
f:id:soyukke:20190606223029p:plain
文字列がそのまま出力される!

おしまい!