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
を使ったほうがよさそう。