Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

Go プログラミング実践入門を読みながら Go での Web App のハローワールド

$
0
0

先ほど脱線して http のクライアント側の機能に走ってしまったので気を取り直してサーバー側に行きたいと思います。

といってもハローワールドするだけなら凄く簡単。本当に凄く

package main

import (
    "fmt""net/http"
)

func main() {
    http.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {
        fmt.Fprintf(res, "Hello world")
    })
    http.ListenAndServe(":8080", nil)
}

HandleFunc でハンドラーを登録して ListenAndServe で待つ。以上終了。できた。

f:id:okazuki:20181031222105p:plain

試しに http://localhost:8080/hoge/foo?bar=puyopuyoを叩いてハンドラーの関数にブレークポイントはってリクエストの構造体の中身を見てみた。

f:id:okazuki:20181031222352p:plain

当然と言えば当然だけど基本的なものは詰まってるので、後は頑張ればいけそう。

ちなみにパスに対して何かしらするものを登録するのは HandleFunc の他に Hundle というのがあるみたい。 Handle には以下のような Handler インターフェースを渡す。

type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
}

つまり、さっきのをこれを使う用に書き直すとこんな感じ。

package main

import (
    "fmt""net/http"
)

type MyHandler struct {
}

func (*MyHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(res, "Hello world!! Handler version.")
}

func main() {
    http.Handle("/", &MyHandler{})
    http.ListenAndServe(":8080", nil)
}

今回は MyHandler がデータを何も持ってない構造体なので、何も嬉しくないけど設定情報とかを持たせれる点で HandleFunc より柔軟そう。

現に以下の FileServer 関数の例では http.FileServerを使って特定ディレクトリの下のファイルを返すようにしてるみたい。

https://golang.org/pkg/net/http/#FileServer

試しに以下のコードを動かすと C:\Workの下のファイルを返してくれるようになった。

package main

import (
    "fmt""net/http"
)

type MyHandler struct {
}

func (*MyHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(res, "Hello world!! Handler version.")
}

func main() {
    http.Handle("/", http.FileServer(http.Dir("/work")))
    //http.Handle("/", &MyHandler{})
    http.ListenAndServe(":8080", nil)
}

f:id:okazuki:20181031224404p:plain

http.FileServer関数で作ったやつは、素直にパスをみてファイルを返してくれるみたいなので/static/とかにマッピングすると C:\Workの下にも static フォルダを切らないと NotFound になる。 基本的には、パスから static を外して欲しいから、そこらへんのことをしてくれると思われるのが http.StripPrefix関数。こんな感じでいける。

package main

import (
    "fmt""net/http"
)

type MyHandler struct {
}

func (*MyHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(res, "Hello world!! Handler version.")
}

func main() {
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("/work"))))
    http.Handle("/", &MyHandler{})
    http.ListenAndServe(":8080", nil)
}

これで http://localhost:8080/static/hello.txtにアクセスすると c:\work\hello.txtの中身が返ってくるし、http://localhost:8080/hogehogeみたいなのにアクセスすると MyHandler のほうに処理がいく。

結構単純でいいね。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>