【Linux】開発者は知っておきたいcurlコマンドのオプション

curlコマンドのオプションやら動きやら案外知らないことに気づいたのでこの機会にまとめておきました。

curlコマンドとは?

curlコマンドは、手軽にHTTPリクエストを飛ばすことができるコマンドです。linuxやmacなら概ね標準で入っているので、特に前準備なくコマンドラインでサクッと試せるのがのいいところです。

しかし、オプションの数が膨大なのと、毎日使うこともないので毎回このオプション何やっけ?と思うことが多いです。とりあえず最低限これを知っておけばAPIの検証などには困らないかな〜と思うものをまとめました。

VS Codeでサクッと検索したい場合はREST Clientがおすすめ

最近はVS Codeの拡張機能である「REST Client」を使って検証するのに嵌ってます。

詳細は下記の記事にありますが、.httpという拡張子のファイルにリクエストを書くだけで簡単にAPIの検証ができます。

https://example.com/

また、curlコマンドを出力することができるのでコマンドラインで実行したい場合などに活用することもできます。

VS Code上でHTTPリクエストを送信し、VS Code上でレスポンスを確認できる「REST Client」拡張の紹介 – Qiita

curlコマンドのオプション

パラメータを指定してPOSTしてみる -d -data

# POSTリクエスト
$ curl -d "name=hogehoge&status=2" http://www.example.com/

# 上のコマンドと同じ意味
$ curl -x POST -d "name=hogehoge&status=2" http://www.example.com/

curlコマンドは、デフォルトで実行した場合はGETになりますが、上記のように-xオプションで指定するとPOSTPUTを指定することができます。

ちなみに-dにパラメータを設定するだけで、POSTとして認識してくれます。

GETかPOSTか確認する -v -verbose

先ほどの検証も兼ねて試してみます。-vを付与することでリクエストヘッダも確認ができます。

# GETの場合 ※一部抜粋
$ curl -v https://qiita.com/
> GET / HTTP/2
> Host: qiita.com
> User-Agent: curl/7.54.0
> Accept: */*

# POSTの場合 ※一部抜粋
$ curl -v -d "hoge=fuga" https://qiita.com/
> POST / HTTP/2
> Host: qiita.com
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 6
> Content-Type: application/x-www-form-urlencoded

HTTP Headerを確認する -I -i -v

先ほどにも紹介しましたが、下記のオプションを設定することで、リクエストヘッダーやレスポンスデータを確認することができます。

$ curl -I https://qiita.com/
=> HTTPレスポンスヘッダーのみ表示する

$ curl -i https://qiita.com/
=> HTTPレスポンスヘッダーとレスポンスボディを表示する

$ curl -v https://qiita.com/
=> HTTPリクエストもレスポンスもいろいろと表示す

結果をファイルに出力する -o

出力結果をファイルに書き出すことができます。オプションの後にファイル名を記載することができます。

$ curl -I https://qiita.com/ -o curl.log
$ cat ./curl.log

リダイレクト先にもリクエストを発行する -L

デフォルトでは、リダイレクト設定されているURLにアクセスした時はリクエストを発行しませんが、このオプションをつけておくと発行してくれます。ただし、ドメインが変わった場合は効かないので注意が必要です。

$ curl -L http://www.example.com/

HTTPヘッダーの指定 -H -header

$ curl -H "Content-Type: application/json" http://www.example.com/

Content-Typeなどを指定することができる。

認証情報の付与 -u -user

# パスワードを設定することも可能
$ curl -user ec2-user:PASSWORD1234 http://www.example.com/

# パスワードなし
$ curl -user ec2-user http://www.example.com/

ユーザー名を指定するだけの場合、curlはパスワードの入力を求めます。

ユーザー名とパスワードは最初のコロンで分割されるため、このオプションでユーザー名にコロンを使用することはできません。それでもパスワードはできます。

SSL証明書を無視する -k -insecure

$ curl -k https://hogehoge/

SSL証明書を無視する。主に、オレオレ証明書を使っているWebサーバーにアクセスする時に利用する。なぜ-kなのかは不明。

出力結果を制御 -s -S

# 進捗メータやエラーメッセージを表示しない
$ curl -s http://www.example.com/

# エラーメッセージのみ表示する
$ curl -sS http://www.example.com/

サイレントモードで、進行状況メーターやエラーメッセージを表示しません。リダイレクトしない限り、潜在的に端末/ stdoutに要求されたデータを出力します。-s-Sの両方を使用すると、失敗した場合にcurlにエラーメッセージが表示されます。

参考文献

本記事を記載する上で下記のページを参考にさせていただきました。