GoでクエリパラメータのあるGETリクエストを投げる
はじめに
Goのnet/http
パッケージを使ってクエリパラメータのあるGETリクエストを投げたかった際、?
や&
をつなげてパラメータを作成するのは面倒なのでやりたくなかった。
良い方法はないかと公式のAPIドキュメントを見ていたらやはり良い方法があったのでまとめておく。
方法
URLを文字列をして扱うのではなく、net/url
のURLオブジェクトとして扱い、それによって利用できるQuery()
にパラメータを追加していくというやり方だ。
package main
import (
"fmt"
"net/http"
"net/url"
)
func main() {
// URLオブジェクトを作成
u, err := url.Parse("https://example.com/hoge")
if err != nil {
// handle error
}
// クエリパラメータを追加
q := u.Query()
q.Set("key1", "value1")
q.Set("key2", "value2")
u.RawQuery = q.Encode()
// GETリクエストを送信
res, err := http.Get(u.String())
if err != nil {
// handle error
}
defer res.Body.Close()
}
詳細
Query()
からはValues
型の値が返ってくるが、これは以下のように定義されたmapになる。
type Values map[string][]string
これに対してSet(key, value string)
でパラメータを追加していき、エンコードしたものをクエリパラメータとしてURLオブジェクトに設定するという流れになる。
q.Set("key1", "value1")
q.Set("key2", "value2")
u.RawQuery = q.Encode()