レスポンス

Go標準ライブラリのnet/httpパッケージを利用して、レスポンスを書き込む方法を説明します。

レスポンスの書き込み

HTTPレスポンスは次のように書き込みます。

package main

import (
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", handler)
    server := http.Server{
        Addr:    ":8080",
        Handler: mux,
    }
    server.ListenAndServe()
}

func handler(w http.ResponseWriter, r *http.Request) {
    // レスポンスヘッダの設定
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")

    // ステータスコードの設定
    // この後でレスポンスヘッダの設定はできない
    w.WriteHeader(http.StatusBadRequest)

    // レスポンスボディの書き込み
    w.Write([]byte("Bad request!\n"))
    // http.Requestはio.Writerとして扱えるため、これでもOK
    // fmt.Fprintln(w, "Bad request!")
}

次の順序通りに実行する必要がある点に注意してください。

  1. ResponseWriter.Header.Set:ヘッダを設定する
  2. ResponseWriter.WriteHeader:ステータスコードを設定し、ステータス行とヘッダを送信する
  3. ResponseWriter.Write:ボディを書き込む

Webサーバを起動して、curlコマンドを使って実行します。

curl -i "localhost:8080/"

実行結果は次の通りです。ハンドラで設定した内容が返却されたことを確認できます。

HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=utf-8
Date: Sat, 12 Dec 2020 12:12:12 GMT
Content-Length: 13

Bad request!