リクエスト

Go標準ライブラリのnet/httpパッケージを利用して、リクエストを取得する方法を説明します。

開始行の取得

HTTPリクエストの開始行は次の通り取得できます。

package main

import (
    "fmt"
    "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) {
    // HTTPメソッド
    fmt.Fprintln(w, "Method:", r.Method)
    // URL
    fmt.Fprintln(w, "URL:", r.URL)
    // HTTPバージョン
    fmt.Fprintln(w, "Proto:", r.Proto)
}

このプログラムのポイントは次の通りです。

  • Request.Method:HTTPメソッドを文字列で取得
  • Request.URL:URLをurl.URL型で取得
  • Request.Proto:プロトコルバージョンを文字列で取得

Webサーバを起動して、http://localhost:8080にアクセスすると、HTTPリクエストの開始行の内容が表示されます。

Method: GET
URL: /
Proto: HTTP/1.1

ヘッダの取得

HTTPリクエストのヘッダは次の通り取得できます。

package main

import (
    "fmt"
    "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) {
    // リクエストヘッダの取得
    fmt.Fprintln(w, "# Header")
    for k, v := range r.Header {
        fmt.Fprintln(w, k, v)
    }
    fmt.Fprintln(w, "# Header.Get")
    for k := range r.Header {
        fmt.Fprintln(w, k, r.Header.Get(k))
    }
}

このプログラムのポイントは次の通りです。

  • Request.Header:ヘッダ全体をキーが『ヘッダ名』、値が『ヘッダ値のスライス』のマップとして取得
  • Request.Header.Get:指定したキーのヘッダ値を文字列で取得(複数の値はカンマ区切りで表現)

Webサーバを起動して、http://localhost:8080にアクセスすると、HTTPリクエストのヘッダの内容が表示されます。

次は筆者の環境での実行結果です。実行結果は環境により異なります。

# Header
User-Agent [curl/7.64.1]
Accept [*/*]
# Header.Get
User-Agent curl/7.64.1
Accept */*

ボディの取得

HTTPリクエストのボディはRequest.Bodyにより取得できます。

package main

import (
    "fmt"
    "io/ioutil"
    "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) {
    // リクエストボディの取得
    b, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Fprintln(w, err)
        return
    }
    fmt.Fprintln(w, string(b))
}

Webサーバを起動して、curlコマンドを使ってリクエストボディを送信します。

curl -X POST "localhost:8080/" -d "a=1"

実行結果は次の通りです。リクエストボディの内容を取得できたことが確認できます。

a=1