サーバーを立てる
標準ライブラリだけで立つ
Go
package main
import "net/http"
func main() {
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("ok"))
})
http.ListenAndServe(":8080", nil)
}これだけで HTTP サーバーが動きます。何も追加でインストールしていません。 net/http は Go に最初から入っています。
Node.js で Express を入れ、設定を書いてから始めたのと比べると、出発点が違います。Go では標準ライブラリだけで本番のサーバーを書くことも珍しくありません。
2つの登場人物
Go
func(w http.ResponseWriter, r *http.Request)この形が、Go のハンドラです。
プレーンテキスト
w 応答を書く先。ここに書いたものが相手に届く
r 届いたリクエスト。パスやメソッドや本文が入っているr にポインタが付いているのは、リクエストが大きいのでコピーを避けるためです。第6章のポインタレシーバと同じ理由です。
応答を書く
Go
w.Write([]byte("ok"))Write はバイト列を受け取ります。文字列をそのままは渡せないので、[]byte(...) で変換します。第2章でやった明示的な型変換です。
ステータスコードを指定するときは、書く前に呼びます。
Go
w.WriteHeader(404)
w.Write([]byte("not found"))順番が逆だと効きません。Write を先に呼んだ時点で 200 が確定してしまいます。第8章で 404 を返すときに、必ず引っかかる場所です。
このコースでの確かめ方
実際にサーバーを起動すると、止めるまでプログラムが終わりません。採点ができないので、このコースでは httptest を使います。
Go
import "net/http/httptest"
req := httptest.NewRequest("GET", "/health", nil)
rec := httptest.NewRecorder()
handler(rec, req)
// rec に応答が記録されている偽のリクエストを作り、偽の記録係に応答を書かせます。サーバーを起動せずにハンドラだけを試せるので、テストの定番です。実務でもこの形で書きます。
記録された内容はこう取り出します。
Go
res := rec.Result()
res.StatusCode // 200
body, _ := io.ReadAll(res.Body)
string(body) // ok要件
healthHandlerが本文にokを書く- ステータスコードは 200(明示しなければ 200 になる)
callHealthはステータス 本文の形を返す
入出力例
callHealth() → "200 ok"ヒント
編集 ゆめさく編集部