13
11

More than 5 years have passed since last update.

【Go】URLクエリパラメータをパースする

Last updated at Posted at 2017-11-06

*11/7 kyoh86さんに指摘して頂いた部分を修正致しました。

はじめに

Goでクエリパラメータ(クエリ文字列)をパースしたかったのだが、ソースを見る以外情報が見つからなかったのでメモ。

結論

net/urlのQueryメソッドを呼ぶことでmap[string][]string型にパースできます。

import "net/url"
u, _ := url.Parse("https://xxx.com?a=AAA&b=BBB&c=CCC&d=DDD")
query := u.Query()
// query -> map[a:[AAA] b:[BBB] c:[CCC] d:[DDD]]

解説

Queryメソッドのソースを確認してみると、RawQueryフィールドをParseQueryに渡していることがわかります。

net/url/url.go
// Query parses RawQuery and returns the corresponding values.
// It silently discards malformed value pairs.
// To check errors use ParseQuery.
func (u *URL) Query() Values {
  v, _ := ParseQuery(u.RawQuery)
  return v
}

RawQueryフィールド

net/url.URL構造体は、RawQueryというstringフィールドを持っており、生クエリを保持しています。
ソースコードには以下のように記載されています。

net/url/url.go
RawQuery   string    // encoded query values, without '?'

ParseQuery関数

net/url#ParseQueryは、map[string][]string型の値を返します。
公式リファレンスには以下のように記載されています。

ParseQueryはURLエンコードされたクエリ文字列を解析し、各キーに指定された値をリストしたマップを返します。 ParseQueryは常に見つかったすべての有効なクエリパラメータを含む非nilマップを返します。 errがもしあれば、遭遇した最初の復号誤りを記述します。

クエリは、アンパサンドまたはセミコロンで区切られたkey = valueの設定のリストであると予想されます。 等号のない設定は、空の値に設定されたキーとして解釈されます。

13
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11