はじめに
この実験では、Go 言語のnet/httpパッケージを使って基本的な HTTP サーバを書く能力をテストすることを目的としています。
HTTP サーバ
2 つのルート:/hello と /headers を処理できる簡単な HTTP サーバを書くように求められています。/hello ルートは単純な "hello" レスポンスを返す必要があり、/headers ルートはすべての HTTP リクエストヘッダを返す必要があります。
- サーバは
net/httpパッケージを使用する必要があります。 /helloルートは "hello" レスポンスを返す必要があります。/headersルートはすべての HTTP リクエストヘッダを返す必要があります。- サーバはポート
8090で待ち受ける必要があります。
## サーバをバックグラウンドで実行します。
$ go run http-servers.go &
## `/hello` ルートにアクセスします。
$ curl localhost:8090/hello
hello
以下が完全なコードです:
// `net/http` パッケージを使えば、基本的な HTTP サーバを書くのは簡単です。
package main
import (
"fmt"
"net/http"
)
// `net/http` サーバにおける基本的な概念は
// *ハンドラ* です。ハンドラは `http.Handler` インターフェイスを実装するオブジェクトです。
// ハンドラを書く一般的な方法は、適切なシグネチャの関数に対して `http.HandlerFunc` アダプタを使うことです。
func hello(w http.ResponseWriter, req *http.Request) {
// ハンドラとして機能する関数は
// `http.ResponseWriter` と `http.Request` を引数に取ります。
// レスポンスライタは HTTP レスポンスを埋めるために使用されます。
// ここでの単純なレスポンスはただ "hello\n" です。
fmt.Fprintf(w, "hello\n")
}
func headers(w http.ResponseWriter, req *http.Request) {
// このハンドラは、すべての HTTP リクエストヘッダを読み取り、
// それらをレスポンスボディにエコーすることで、もう少し洗練されたことを行います。
for name, headers := range req.Header {
for _, h := range headers {
fmt.Fprintf(w, "%v: %v\n", name, h)
}
}
}
func main() {
// サーバルートにハンドラを登録する際には、
// `http.HandleFunc` という便利な関数を使います。
// これは `net/http` パッケージ内の *デフォルトルータ* を設定し、
// 関数を引数に取ります。
http.HandleFunc("/hello", hello)
http.HandleFunc("/headers", headers)
// 最後に、ポートとハンドラを指定して `ListenAndServe` を呼び出します。
// `nil` は、先ほど設定したデフォルトルータを使用することを示しています。
http.ListenAndServe(":8090", nil)
}
まとめ
この実験では、2 つのルート:/hello と /headers を処理できる簡単な HTTP サーバを書くように求められました。各ルート用のハンドラを書き、サーバに登録する方法を学びました。最後に、サーバを起動して着信リクエストを待ち受ける方法を学びました。