前提
❯ curl --version
curl 7.54.0 (x86_64-apple-darwin18.0) libcurl/7.54.0 LibreSSL/2.6.4 zlib/1.2.11 nghttp2/1.24.1
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy
前置き
Web APIのテストなんかで curl
コマンドをよく使うと思いますが,ページネーションなどが絡むと ?page=3&num=10
みたいにたくさんのパラメータを渡す必要がある場合があり,わりと面倒です.
curl 'example.com/contents?page=3&num=10'
まぁこれでも良いのですが, ''
で囲むのを忘れるとシェルがエラー出したりします.
❯ curl example.com/contents?page=3&num=10
[1] 9757
zsh: no matches found: example.com/contents?page=3
[1] + exit 1 curl example.com/contents?page=3
楽な指定方法
❯ curl -v -G -d page=3 -d num=10 example.com/contents
* Trying 93.184.216.34...
* TCP_NODELAY set
* Connected to example.com (93.184.216.34) port 80 (#0)
> GET /contents?page=3&num=10 HTTP/1.1
> Host: example.com
> User-Agent: curl/7.54.0
> Accept: */*
-G
を付けるのがポイントです.通常 -d
でbodyを指定するとPOST
になってしまうのですが,-G
を付けることにより強制的にGET
にします.
そしてその場合-d
で指定したデータは?foo=bar
の形式で良い感じに付けてくれるようになります.
結論
- 自分でシェルの特殊文字をエスケープする必要がなくなる
- パラメータの順序を入れかえたりしても
?
と&
を書き換えたりする必要がなくなる - 複数のパラメータを独立して指定できるのでスクリプトが書き易くなる
などの効果が得られます.たぶん.