curlで個人的によく使うコマンド(オプション)のまとめ【HTTPリクエスト】

curlはHTTPリクエストを試すのによく使うコマンドです。ここでは個人的によく使うcurlのコマンドやオプション一覧、忘れがちなcurlの便利な使い方などをまとめています。

環境

最終更新日:2022/9/25

■curlはこの環境で試しています。
CentOS Linux 7.9
macOS Big Sur(バージョン11.6.6)
AWS ec2のAmazon Linux release 2 (Karoo)
(*バージョンはすべてcurl 7.61.1)

curlでhttps(ssl)アクセス時のSSLエラー。-kオプション

curlでSSLのサイト(https://〜)にアクセスする時、macOS環境のcurl(ターミナル)は問題なく実行できしたが、CentOSのcurlだと下のエラーが発生しました。

$ curl https://○○○○.com/
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
これはSSL証明書エラーで、-kオプションで証明書エラーをスキップして実行する事ができます。
$ curl -k https://○○○○.com/
<html  lang="ja" >
〜

これ以降のcurlコマンド例を試してSSLエラーが出る場合も、-kオプションを併用してください。

HTTPヘッダを見る。-Iオプション、-iオプション

HTTPリクエストで、HTTPヘッダー(レスポンスヘッダ・一般ヘッダ・エンティティヘッダ)の情報を見たい時は、-Iオプションを使います。

$ curl -I https://○○○○.com/
HTTP/1.1 200 OK
Date: Tue, 21 Jun 2022 20:54:07 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/7.3.20
Expires: Thu, 23 Nov 1981 07:35:00 GMT
Link: < https://○○○○.com/wp-json/>; rel="https://api.w.org/"
Content-Type: text/html; charset=UTF-8
Webサーバの情報(Apache・Nginx)や、PHPのバージョン(PHPを使用しているなら)などの情報を知る事ができます。

HTTPヘッダーと本体(HTML)の両方を取得したい時は、-iオプションです。

$ curl -i https://○○○○.com/
HTTP/1.1 200 OK
Date: Tue, 21 Jun 2022 21:26:53 GMT
Server: Apache/2.2.15 (CentOS)
〜
<!DOCTYPE html >
<html lang="ja" >
〜

HTTPリクエストヘッダも見たいなら、-vオプション

レスポンス系のHTTPヘッダーではなく、リクエストヘッダーを見たい時は、-v(--verbose)オプションで確認できます。

-vはverbose(冗長)オプションで、HTTPリクエスト操作中の詳細な情報を確認する事ができるので、HTTP通信ができない時の原因究明のデバッグで使えたりします。

$ curl -v https://○○○○.com/
*   Trying ***.***.***.***...
* TCP_NODELAY set
* Connected to ○○○○.com (***.***.***.***) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
〜
*  SSL certificate verify ok.
> GET / HTTP/1.1
> Host: ○○○○.com
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 21 Jun 2022 22:34:21 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/7.3.20
〜
リクエストヘッダのGETメソッドやUser-Agentが確認できますし、また、リクエストヘッダの情報だけでなく、その他のHTTPヘッダーやSSL通信の情報も確認できたりしますね。

-v(--verbose)の反対で、-s(--silent)オプションもあります。-sはサイレントモードです。curlで取得した結果を文字列処理するためにパイプで別のコマンドに渡す場合、通信時間の進捗データやエラーメッセージが出力される事がありますが、これらが不必要で非表示にしたい場合に-sオプションを使います。

ChromeブラウザでHTTPリクエストヘッダとレスポンスヘッダの表示

ブラウザのChromeでもデベロッパーツール(Developer Tools)を使えば、HTTPリクエストヘッダやレスポンスヘッダの情報を表示して確認する事ができます。

デベロッパーツールを起動するには、ブラウザ画面を右クリック->"検証"でできます(ショットカットでの起動は、macなら「Command+Option+I」、Windwosなら「Ctrl+Shift+J 」または F12)。

デベロッパーツールの簡単な使用例については別ページで書いていますので、そちらを参考にしてください。
Chromeデベロッパーツールを使って、HTTPリクエストヘッダーやHTTPレスポンスヘッダーの情報を確認する

HTTPリクエストヘッダを指定する。-Hオプション

HTTPリクエストでリクエストヘッダを指定したい時は、-Hオプションを使います。

$ curl -v https://○○○○.com/ \
> -H 'Hoge-Header: hogeheadervalue' \
> -H 'User-Agent: hogehogeAgent' 
〜
> GET / HTTP/1.1
> Host:○○○○.com
> Accept: */*
> Hoge-Header: hogeheadervalue
> User-Agent: hogehogeAgent
〜
-vでリクエストヘッダーを確認すると、User-Agentの値が変更されているのと、新しいHoge-Headerというヘッダーが追加されているのがわかります。

ですので、リクエストヘッダーでIf-Modified-SinceやIf-None-Matchを指定して条件付きHTTPリクエストをしたい時は、-Hオプションを指定すればできます。

If-Modified-SinceやIf-None-Matchを使う条件付きHTTPリクエストについては別ページで詳しく書いていますので、そちらを参考にしてみてください。
Webページの最新更新日時の情報を取得する

-Hオプションでユーザーエージェント(User-Agent、UA)を指定できるので、Webサイトの中にはブラウザでは問題なく見れるけど右クリックできなくてHTMLソースを見れないし、また、curlを実行しても"403 Forbidden"を返してHTMLソースを取得できないWebサイトがあります。

$ curl -I https://○○○○.com/
HTTP/1.1 403 Forbidden
〜
そういうWebサイトは、ユーザーエージェントでHTTPリクエストを受け付けるかどうかを判断している場合もあるので(curlなら受け付けないとか)、curlでもユーザーエージェントを適当に指定すれば問題なく実行できてHTMLソースが取得できる場合もあります。
$ curl -I https://○○○○.com/ -H 'User-Agent: hoge' 
HTTP/1.1 200 OK
〜
ただ、Webサイト運営者も意図があってリクエストを受け付けないようにしていると思うので、悪用はしないように!

アマゾンでネットワーク関連の本を探す [広告]

HTTPリクエストで取得したHTMLをファイル保存する。-oオプション(--outputオプション)

curlでHTTPリクエストして取得したHTMLをファイルに出力したい時は、-oオプション、もしくは、--outputオプションを使います。出力するファイル名は、-oオプションのすぐ後に指定する必要があります(ファイル名の指定は必須で、指定しないとエラーが出てできないです)。

$ curl https://○○○○.com/ -o hoge.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 89323    0 89323    0     0   431k      0 --:--:-- --:--:-- --:--:--  431k

ネット上のファイルを取得したい場合、wgetコマンドの方がよく使うかもしれませんね。

HTTPのPOSTリクエストでデータ送信する。-Xオプション、-dオプション(--dataオプション)、--data-urlencodeオプション

HTTPリクエストには、GET・POST・HEAD・PUT・OPTIONなどのメソッドがあります。

curlでメソッドを指定しない場合はGETメソッドになりますが、メソッドを指定したい時は、-Xオプションを使います。

そして、POSTメソッドでWebサーバにデータ送信したい場合、送信するデータを指定をするには-dオプション、もしくは、--dataオプションを使います。

$ curl -X POST https://○○○○.com/ -d 'id=5'
$ curl -X POST https://○○○○.com/ --data 'id=5'

また、POSTメソッドで複数データを送信したい場合、-dオプション(--dataオプション)を複数使用するか、複数データを&で繋ぎます。

$ curl -X POST https://○○○○.com/ -d 'id=5' -d 'code=key1'
$ curl -X POST https://○○○○.com/ -d 'id=5&code=key1'

また、日本語データをURLエンコードして送信したい時は、--data-urlencodeオプションを使います。

$ curl -X POST https://○○○○.com/ --data 'id=5&code=key1' --data-urlencode 'color=黄色'

これだけでも覚えておくと、WebページのHTMLフォーム(formやinputタグ)などでPOSTメソッドでデータ送信したい時に、curlコマンドで色々と試す事ができて便利です。

Webサイト(HTML)ではなくjsonデータを返してくる場合、curlの取得結果をjqコマンドに渡してあげる

curlでHTTPリクエストをするとWebサイト(HTML)ではなくjsonデータを返してくるパターンがありますが、この場合はcurlの結果をパイプでjqコマンドに渡すのがデータ処理をするのに便利です。jqコマンドはjsonデータを整形・加工するのに便利なコマンドです。

curlとjqの使用例は別ページで少し書いていますので、そちらを参考にしてください。
自分のグローバルIPアドレス・プライベートIPアドレスを確認するコマンド色々