はじめに
近ごろは Postman を使うことが多くなりましたが、サーバからのリクエストなどではコマンドラインが必要です。検索キーワード上位ランクイン確実な curl コマンドのオプションについてまとめました。
curl はさまざまなスキーム(プロトコル)をサポートしていますが、あくまで自分的備忘録のため、HTTP および HTTPS のみ、また膨大なオプションの中から過去に使用したことのあるオプションのみを対象としています。
確認で用いた curl のバージョン情報:
$ curl --version curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3 Release-Date: 2020-01-08 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
オプション
基本的に指定する値はシングルクオーテーション '
で括るのが吉です。ダブルクオーテーション "
だったり、括らなかったりした場合、ヒストリ展開等で予期せぬ形で curl に渡される場合があるためです。
-X, --request <command>
言わずもがなリクエストメソッド。省略時は GET です。
-H, --header <header/@file>
リクエストヘッダを追加します。複数のヘッダを追加することもでき、その場合は -H, --header
を複数書きます。
複数のヘッダを使用する例:
curl --request POST 'http://localhost:8080/' \ --header 'Date: Wed, 21 Oct 2015 07:28:00 GMT' \ --header 'Content-Type: application/octet-stream' \ --data-raw 'abc'
ます。また、curl が付与するヘッダを削除することもできます。削除する場合は Host: といった具合に、コロン :
を含むヘッダ名、だけを指定します。一方、空のヘッダを送信する場合は X-Custom-Header; といった具合に、セミコロン ;
を含むヘッダ名、だけを指定します。
<@file>
の形で各行にヘッダを列挙したファイルも使用できます。
-L, --location
リダイレクト(Location ヘッダと 3XX のレスポンスコード)を追従します。
-d, --data <data>
POST リクエストでデータを指定するオプション。HTML フォームのデータを扱うときと同じ方法で送信します。 Content-Type ヘッダに application/x-www-form-urlencoded が自動的にセットされます。
オプションが複数セットされている場合、指定されたデータは &
文字で連結されます。例えば -d name=daniel -d skill=lousy
とした場合、実際の送信データは name=daniel&skill=lousy
となります。
ファイルをデータとして扱いたい場合は @<file>
という形で <data>
に指定します。この場合、ファイル中の CR/CF は削除して サーバに送信します。
--data-ascii <data>
-d, --data
のエイリアス(別名)です。動作は -d, --data
と同じです。
--data-urlencode <data>
-d, --data <data>
と同じだけど URL エンコードしてくれるオプションです。 <data>
部分が特殊で、以下の 5 種類のフォーマットのどれかに従う必要があります。
content
: content を URL エンコードする。=
や@
を含まないように注意(下の 4 の構文にマッチしてしまうため)=content
: content を URL エンコードする。content
に=
や@
を含む場合に使う。先頭の=
は除去されることになるname=content
: content を URL エンコードする。name は自前で URL エンコードしておかなければならない@file
: ファイルを URL エンコードするname@file
: ファイルを URL エンコードし、name=URL エンコードしたファイル
のパターンにする。name は自前で URL エンコードしておかなければならない。 3. と 4. の合わせ技
認可サーバにトークンを送る例:
curl --request POST 'localhost:9001/token' \ --header 'Authorization: Basic b2F1dGhfY2xpZW50OjAwM2JhZDBhLWE3MTYtNDk1YS1hZmIyLWMzNGI4ZWQ4ZTQ0OA==' \ --data-urlencode 'grant_type=authorization_code' \ --data-urlencode 'redirect_uri=http://localhost:9000/callback' \ --data-urlencode 'code=lai7Caiv' \ --data-urlencode 'scope=openid'
--data-binary <data>
ポストするデータをそのままの形で送信するオプション。<data>
には @<file>
の形でファイル指定も可能です。ファイル中の CR/LF は削除せずに サーバに送信します。
-d, --data
と同様に、Content-Type ヘッダに application/x-www-form-urlencoded が自動的にセットされますが、-H, --header
オプションで Content-Type ヘッダを上書きすることも可能です。
--data-raw <data>
-d, --data <data>
と同じだけど <data>
に @<file>
が使えない。ファイルとして解釈されず、@
文字がそのまま送信されます。
-o, --output <file>
curl の出力を標準出力の代わりに <file>
に出力します。
-v, --verbose
言わずと知れた verbose モードです。ヘッダのやり取りなどをのぞき見したい場合に使います。物足りない場合、 --trace
や --trace-ascii
オプションを使います。
--trace <file>
-v, --verbose
より詳細な、完全なトレースダンプを <file>
に出力します。また、ハイフン -
を指定することにより標準出力にすることもできます。
--trace-ascii <file>
-v, --verbose
より詳細な、完全なトレースダンプを <file>
に出力します。また、ハイフン -
を指定することにより標準出力にすることもできます。--trace
に似ていますが、16 進部分を省略し、ダンプの ASCII 部分のみを表示します。
-x, --proxy [protocol://]host[:port]
proxy サーバを指定します。7.21.7 以降であれば socks5 も使えます。
curl --request GET 'https://www.jspnet.co.jp/' \ --proxy 'socks5://localhost:1080'
--noproxy <no-proxy-list>
proxy を通したくないホストをカンマ ,
区切りで列挙します。
curl --request GET 'http://localhost:8080/' \ --proxy 'socks5://localhost:1080' \ --noproxy 'localhost, 127.0.0.1'
-s, --silent
サイレントモードです。プログレスメーターを表示しません。
おわりに
過去 5 年くらいで使ったことのあるオプションだけをまとめてみました。とりあえず、curl で確認する程度であればこれだけ知ってれば十分な感じですが、使えるオプションを発見したら追記していきたいと思います。
追伸:
答え合わせのために検索したところ、以下のサイトに --data 系のオプションについて詳しくまとまっていました。表になっていて見やすいので合わせてご確認下さい。
curlのオプション--data, --data-binary, --data-raw, --data-urlencodeの違い - Qiita