リクエスト
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