Go 言語による基本的な HTTP サーバ

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、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 サーバを書くように求められました。各ルート用のハンドラを書き、サーバに登録する方法を学びました。最後に、サーバを起動して着信リクエストを待ち受ける方法を学びました。