created: 2024-04-23T07:49:25.985Z

curl で GET リクエストにちゃんとクエリパラメータをつける

すごくよくあるユースケースなのにハマりどころが 2 つあり、しかも検索しても(記事が古いせいなのか)期待通りに動かないものが上に出てくるのでメモ。

クエリ文字列の付け方 2 種類

クエリパラメータをつけるためのオプションには --data--data-urlencode の 2 つがある。

短縮系の -d がよく使われるが、これは --data の短縮系なので URL エンコードされてない形式でリクエストに乗ってしまう。POST する場合は形式が JSON だったりして問題にならないことが多いだろうけれども、日本人が GET のクエリパラメータにデータをのせたい場合は --data-urlencode のほうが期待通りなことが多いはず。

curl の -XGET--get は違う

微妙に違うというものでもなく、クエリパラメータをつけようとした時に全然違う挙動になる。 これはドキュメントにもはっきり書いてある。

-X, --request <method>

-X はもともとリクエストメソッドを変更するためだけのオプション

Change the method to use when starting the transfer.

-G, --get

「GET で --data をつける場合はこれを使うよ」と書いてある。

(HTTP) When used, this option makes all data specified with -d, --data, --data-binary or --data-urlencode to be used in an HTTP GET request instead of the POST request that otherwise would be used. The data is appended to the URL with a '?' separator.

-XGET--get の挙動の違い

--data 的なオプションがついているときに挙動が違う。

  • --get は渡されたデータをクエリパラメータとして URL に付記しようとする
  • -XGET は渡されたデータを GET なのにボディに入れてリクエストをしようとする

おそらくせっかく GET リクエストを作ろうとしているのだから、--get を使ったほうが期待通りの挙動になるだろう。

使う

だいたいの場合はオプションはこの組み合わせで使うと期待通りの挙動になる。

curl --get "https://example.com/test" --data-urlencode "p=📛"

参考

--get について言及はされているが、英語圏の人が回答しているためかいずれも --data が使われてる。そこは今では --data-urlencode を使ったほうがよさそう。

古代ローマ人の24時間---よみがえる帝都ローマの民衆生活
[ad] 古代ローマ人の24時間---よみがえる帝都ローマの民衆生活
アルベルト・アンジェラ, 関口 英子 (単行本)