Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

curl 備忘録

はじめに

近ごろは 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 種類のフォーマットのどれかに従う必要があります。

  1. content: content を URL エンコードする。=@ を含まないように注意(下の 4 の構文にマッチしてしまうため)
  2. =content: content を URL エンコードする。content=@ を含む場合に使う。先頭の = は除去されることになる
  3. name=content: content を URL エンコードする。name は自前で URL エンコードしておかなければならない
  4. @file: ファイルを URL エンコードする
  5. 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' 

おわりに

過去 5 年くらいで使ったことのあるオプションだけをまとめてみました。とりあえず、curl で確認する程度であればこれだけ知ってれば十分な感じですが、使えるオプションを発見したら追記していきたいと思います。

追伸:

答え合わせのために検索したところ、以下のサイトに --data 系のオプションについて詳しくまとまっていました。表になっていて見やすいので合わせてご確認下さい。

curlのオプション--data, --data-binary, --data-raw, --data-urlencodeの違い - Qiita