GoでURLからクエリパラメータの値を取得する方法について、取り上げます!
http://localhost:8080/todos?size=3&prev_id=2
このようなURLからsizeとprev_idを取り出していく方法を見ていきましょう〜
全体のコード
func (h *TODOHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
myUrl, _ := url.Parse(r.URL.String())
log.Println(myUrl)
params, _ := url.ParseQuery(myUrl.RawQuery)
log.Println(params)
size, err := strconv.ParseInt(params.Get("size"), 10, 64)
if err != nil {
http.Error(w, "invalid size parameter", http.StatusBadRequest)
return
}
では、順番に説明していきますね。
1. URLの分解
myUrl, _ := url.Parse(r.URL.String())
まず、文字列化したURLをurl.Parse()を用いて、URLを要素ごとに分解します。
2. クエリの取得(map型として)
params, _ := url.ParseQuery(myUrl.RawQuery)
次にURLの「?」以降のクエリ文字列部分を取得します。
RawQueryは生クエリを保持しており、string型です。
例えば、http://localhost:8080/todos?size=3&prev_id=2 というURLの場合、
myUrl.RawQueryはsize=3&prev_id=2となります。
url.ParseQueryはこのクエリ文字列(RawQuery) を解析し、キーと値のペアとしてマップに変換します(map[string][]stringの形式)。
上記の例の場合、map[prev_id:[2] size:[3]]がparams変数に代入されます。
3. 取得したクエリの値の型変換
size, err := strconv.ParseInt(params.Get("size"), 10, 64)
params.Get("size")で取得できるsizeクエリの値はstring型です。
そのため、strconv.ParseInt()を用いて、int64に型変換をします。
以上がURLからクエリパラメータを取得する処理になります。
場合によっては、3番の型変換は必要ないかもしれませんね。
参考