2013年3月14日木曜日

Go言語でWebサーバを立てる 第1回 Webサーバアプリを作る


こんにちは。scarvizです。

今回から3回使って、Go言語でWebサーバを立ててみようと思います。
最終的には簡単な動くものを作ってみますが、僕はサーバ屋でもWeb屋でもLinux屋でもないので、色々分からない部分もあります。
なので、もし何かお気付きの点があれば教えて頂けると嬉しいです。

まず、今回から使っていく環境は以下になります。

サーバマシン:CentOS 6.4 x86 (VMware Player)
Go開発マシン:Ubuntu12.04 x86 (VMware Player)
クライアントマシン(操作マシン):Windows7 x64

Go開発マシンで開発をして、サーバマシン(Go環境無し)でGoのWebサーバを動作させ、クライアントマシンでブラウザを立ち上げて確認します。

今回はGo開発マシンを使って、GoでWebサーバアプリを作成してみようと思います。
簡単なものしか作りませんが、本格的に作成したい場合は、やしさんのプレゼン資料が詳しく書いていて分かりやすいと思います。
http://androg.seesaa.net/archives/20130210-1.html




■Topページを作成する
まずは「Welcome!!」と表示するページを作成します。

package main

import (
 "fmt"
 "html"
 "net/http"
 "os"
)

func main() {
    // topページ
    http.HandleFunc("/", Top)

    // Webサーバを8080ポートで開始する
    err := http.ListenAndServe(":8080", nil)

    // エラーが発生した場合にここに到達する
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

}

/*
topページ
*/
func Top(w http.ResponseWriter, r *http.Request) {
    // topページのリクエストがくると「Welcome!!」と表示する
    fmt.Fprintf(w, "<html><body>Welcome!!</body></html>")
}

http.HandleFunc関数でtopページをハンドラに登録します。
"/"でリクエストが来た場合、Top関数を処理します。
Top関数では「Welcome!!」と表示する処理を書いています。

http.ListenAndServe関数でWebサーバを開始します。ポートは8080にしました。
Ctrl+Cでキャンセルするか、実行中にエラーが発生するまで動き続けます。

上記を端末から実行し、ブラウザから下記にアクセスしてみてください。
http://localhost:8080/

「Welcome!!」と表示されていると思います。
端末でCtrl+Cで実行をキャンセルしてみてください。
もう一度アクセスしてみるとエラーになると思います。


■リクエストで受け取った文字列を表示する
リクエストで受け取った文字列を表示してみようと思います。

package main

import (
 "fmt"
 "html"
 "net/http"
 "os"
)

func main() {
    // topページ
    http.HandleFunc("/", Top)
    // displayページ
    http.HandleFunc("/disp", Display)

    // Webサーバを8080ポートで開始する
    err := http.ListenAndServe(":8080", nil)

    // エラーが発生した場合にここに到達する
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

}

/*
topページ
*/
func Top(w http.ResponseWriter, r *http.Request) {
    // topページのリクエストがくると「Welcome!!」と表示する
    fmt.Fprintf(w, "<html><body>Welcome!!</body></html>")
}

/*
displayページ
*/
func Display(w http.ResponseWriter, r *http.Request) {
    // val1とval2に設定された文字列を取得
    val1 := r.FormValue("val1")
    val2 := r.FormValue("val2")

    // displayページのリクエストがくるとval1とval2を表示する
    fmt.Fprintf(w, "<html><body>Input String: %s, %s</body></html>",
        html.EscapeString(val1), html.EscapeString(val2))
}

"/disp"でリクエストがくるとDisplay関数を処理します。
FormValue関数でURLに含まれる文字列を取得します。
ここではval1とval2で設定された値を取得します。

端末から実行し、下記にアクセスしてみてください。
http://localhost:8080/disp?val1=test&val2=テスト

下記が表示されると思います。

Input String: test, テスト


今回作ったWebサーバアプリは、Ctrl+Cでキャンセルしないと端末を解放してくれません。
Webサーバとして動かすには端末と切り離す必要があります。
次回は端末と切り離せるようにサービス化(daemon)してみようと思います。

0 件のコメント:

コメントを投稿