こんにちはフロントエンドエンジニアのまさにょんです!
今回は、Linuxコマンドの1つであるcurlコマンドについて解説していきます。
目次
- 1 curlコマンドとは?
- 2 curlコマンドを実践する
- 2.1 curlコマンドのバージョン確認
- 2.2 GET通信 Ver.HTML取得編
- 2.3 GET通信 Ver. REST-APIを叩く編
- 2.4 POST通信
- 2.5 POST通信: 「-H」でRequest-Headerを追加
- 2.6 POST通信: 「-d」でRequest-Bodyを追加 (JSONデータを送信)
- 2.7 よく使うcurlのオプションの一覧
- 2.8 通信の詳細情報をすべて出力する「-v」(Debugにも役立つ)
- 2.9 レスポンスヘッダー・レスポンスボディを表示する「 -i 」オプション
- 2.10 レスポンスヘッダーを表示する「 -I 」オプション
- 2.11 実行結果を指定したファイルへ出力する
- 2.12 URLで指定したResourceを指定したファイル名でダウンロードする
- 2.13 curlコマンドのhelpを表示する
- 3 Twitterやってます!Follow Me!
- 4 参考・引用
- 5 Linux関連書籍
- 6 最近の投稿
curlコマンドとは?
curl とは、サーバーにリクエストを送信し、レスポンスを受け取る操作ができるLinuxコマンドです。
HTTP以外でもプロトコルを指定することができ、インターネット上で使用されるプロトコルの多くに対応しています。
正式名称は「client for URL」略して「curl」で、読み方は「カール」です。
cURL 【client for URL】 curlコマンド
cURLとは、主にUNIX系OSでよく利用されるコマンドおよびプログラムの一つで、
様々なプロトコル(通信手順)を用いてURLで示されるネットワーク上の場所との間でデータの送受信を行うもの。
オープンソースソフトウェアとして公開されている。
コマンドラインツールの一種で、シェルなどから “curl” というコマンドに続けてダウンロードしたいURLやオプションなどを記述して実行することで、
その場所からファイルを取得して表示したり、ファイルとして保存することができる。
URLで指定した場所にファイルをアップロードすることもできる。
インターネット上で使用される主要なプロトコルの多くに対応しており、
HTTPやFTP、Telnet、SMTP、POP3、IMAP、TFTP、LDAPなどと、
これらとSSL/TLSの組み合わせ(HTTPS、FTPS、SFTP、POP3S、IMAPS、LDAPSなど)が利用できる。
また、HTTPのPOSTメソッドやPUTメソッドによるデータやファイルの送信、
HTTP Cookieの取得や送信、FTPアップロード、
プロキシを介した通信、IDやパスワードによる認証、デジタル証明書(X.509形式)などにも対応している。
引用元: cURL(curlコマンド)とは
curlコマンドを実践する
それでは、実際にcurlコマンドを実践してみましょう。
curlコマンドのバージョン確認
curlコマンドのバージョン確認は、次のどちらかでできます。
もし次のようなバージョン情報などの実行結果がでなかったら、curlコマンドをインストールしましょう。
# curl のバージョン確認
curl --version
# curl のバージョン確認 Ver.省略形
curl -V
curl 7.79.1 (x86_64-apple-darwin21.0) libcurl/7.79.1 (SecureTransport) LibreSSL/3.3.6 zlib/1.2.11 nghttp2/1.45.1
Release-Date: 2021-09-22
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets
GET通信 Ver.HTML取得編
curlの基本の形は、[ curl 通信するURL ]です。
まずはシンプルなGET通信でHTMLを取得して、効果を確認していきましょう。
ちなみにcurlコマンドでは、HTTPメソッドを指定しない場合、GET通信とみなされます。
それでは『阿部 寛のホームページ』とGET通信をしてみましょう。
以下の両方ともGET通信をしています。
もちろん「 -X 」(–request)オプションを使ってGET通信を指定することもできます。
# 『阿部 寛のホームページ』とGet通信 Ver. HTTPメソッド省略 => GET通信
curl http://abehiroshi.la.coocan.jp/
# 『阿部 寛のホームページ』とGet通信 Ver. HTTPメソッドを指定
curl -X GET http://abehiroshi.la.coocan.jp/
上記コマンドを実行すると、シンプルで美しいHTMLが返却されてきました。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="GENERATOR" content="JustSystems Homepage Builder Version 20.0.6.0 for Windows">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>???????̃z?[???y?[?W</title>
</head>
<frameset cols=18,82>
<frame src="menu.htm" marginheight="0" marginwidth="0" scrolling="auto" name="left">
<frame src="top.htm" marginheight="0" marginwidth="0" scrolling="auto" name="right">
<noframes>
<body></body>
</noframes>
</frameset>
</html>
GET通信 Ver. REST-APIを叩く編
次は、REST-APIとの通信Testをしてみましょう。
REST-APIとの通信Testで役に立つのは、「{JSON} Placeholder」や「httpbin.org」です。
# {JSON} Placeholder とのGET通信
curl -X GET https://jsonplaceholder.typicode.com/todos/1
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
# httpbin.org とのGET通信
curl -X GET http://httpbin.org/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.79.1",
"X-Amzn-Trace-Id": "Root=1-632d06ef-2db4d7d33c3ce81b5abc2a9c"
},
"origin": "221.103.217.254",
"url": "http://httpbin.org/get"
}
POST通信
GET通信の次は、POST通信を試してみましょう。
POST通信をする際は「 -X POST 」のHTTPメソッド指定が必須です。
まずは、何も送信データなど設定せずにPostしてみます。
# POST通信
curl -X POST http://httpbin.org/post
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.79.1",
"X-Amzn-Trace-Id": "Root=1-632d07dd-355ecb130adddc4279c70583"
},
"json": null,
"origin": "221.103.217.254",
"url": "http://httpbin.org/post"
}
POST通信: 「-H」でRequest-Headerを追加
「-H」オプションでRequest-Headerを追加することができます。
「 -H “headerKey: value” 」の形でRequest-Headerを追加できます。
今回は、どのようなデータを受け取りたいのかを「 “accept: application/json” 」で指定しています。
# -H "headerKey: value" で Request-Headerを追加
curl -X POST http://httpbin.org/post -H "accept: application/json"
実行結果のAcceptの欄が「”application/json”」に変わりました。
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.79.1",
"X-Amzn-Trace-Id": "Root=1-632d0932-0ef8f53334e3f4d931182d10"
},
"json": null,
"origin": "221.103.217.254",
"url": "http://httpbin.org/post"
}
POST通信: 「-d」でRequest-Bodyを追加 (JSONデータを送信)
今度はPOSTメソッドでJSONデータを送信します。
JSONデータの送信なので、Request-Headerを「 “content-type: application/json” 」にします。
POSTメソッドでデータを送信する時は「 -d 」オプションを付与して、その後に続けて送信データを設定します。
# httpbin.org とのPOST通信
curl -X POST http://httpbin.org/post -H "content-type: application/json" -d '{
"robotama": "kawaii",
"from": "gunma"
}'
{
"args": {},
"data": "{\n \"robotama\": \"kawaii\",\n \"from\": \"gunma\"\n}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "49",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.79.1",
"X-Amzn-Trace-Id": "Root=1-632d0c35-2eff95475cdda41c0cfb2d76"
},
"json": {
"from": "gunma",
"robotama": "kawaii"
},
"origin": "221.103.217.254",
"url": "http://httpbin.org/post"
}
# {JSON} Placeholder とのPOST通信
curl -X POST https://jsonplaceholder.typicode.com/posts -H "content-type: application/json" -d '{
"robotama": "kawaii",
"from": "gunma"
}'
{
"robotama": "kawaii",
"from": "gunma",
"id": 101
}
よく使うcurlのオプションの一覧
よく使うcurlのオプションの一覧です。
オプション(省略形) | オプション | オプションの効果 |
-X | –request | リクエストの種類を指定する |
-H | –header | リクエストヘッダーを追加する |
-d | –data | POSTリクエストで送信するデータを指定する |
-F | –form | ファイルをアップロードする |
-L | –location | リダイレクトがあったらリダイレクト先の情報を取る |
-u | –user | ユーザー名とパスワードを指定する |
-b | –cookie | 実行時のクッキーを指定する |
-I | –head | レスポンスヘッダーを表示する |
-i | –include | レスポンスヘッダー・レスポンスボディを表示する |
-v | –verbose | リクエストヘッダー・レスポンスヘッダー・レスポンスボディを表示する |
-o | –output | レスポンスボディの出力先を指定する |
-O | –remote-name | リクエスト先のファイル名で保存する |
-s | –silent | 実行中のメッセージを表示しない・余計な出力をしない |
-S | –show-error | エラーメッセージを表示する |
-f | –fail | 失敗してもエラーメッセージを表示しない |
-w | –write-out | 出力フォーマットを指定する |
-h | –help | ヘルプを表示する |
通信の詳細情報をすべて出力する「-v」(Debugにも役立つ)
通信の詳細情報をすべて確認したい場合は「 -v 」オプションが最適です。
リクエストヘッダー・レスポンスヘッダー・レスポンスボディの情報を表示することができるので、Debugにも役立ちます。
まず通信が成功する場合は、次のような感じです。
#『阿部 寛のホームページ』とGet通信「 -v 」
curl -v http://abehiroshi.la.coocan.jp/
### 実行結果 ###
### リクエストヘッダー(Request-Header) ###
* Trying 222.158.205.72:80...
* Connected to abehiroshi.la.coocan.jp (222.158.205.72) port 80 (#0)
> GET / HTTP/1.1
> Host: abehiroshi.la.coocan.jp
> User-Agent: curl/7.79.1
> Accept: */*
>
### レスポンスヘッダー(Response-Header) ###
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Fri, 23 Sep 2022 02:36:12 GMT
< Content-Type: text/html
< Content-Length: 538
< Connection: keep-alive
< Last-Modified: Thu, 27 Feb 2020 07:10:16 GMT
< ETag: "21a-59f8969af8600"
< Accept-Ranges: bytes
< Server: Apache
<
### レスポンスボディ(Response-Body) ###
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="GENERATOR" content="JustSystems Homepage Builder Version 20.0.6.0 for Windows">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>�������̃z�[���y�[�W</title>
</head>
<frameset cols=18,82>
<frame src="menu.htm" marginheight="0" marginwidth="0" scrolling="auto" name="left">
<frame src="top.htm" marginheight="0" marginwidth="0" scrolling="auto" name="right">
<noframes>
<body></body>
</noframes>
</frameset>
* Connection #0 to host abehiroshi.la.coocan.jp left intact
</html>%
リクエストヘッダーの部分を見ると「abehiroshi.la.coocan.jp (222.158.205.72) port 80」と「GET / HTTP/1.1通信」をしたことがわかります。
またレスポンスヘッダーの部分では「HTTP/1.1 200 OK」で通信が成功したことや、
レスポンスデータが「Content-Type: text/html」であることなどが読み取れます。
続いて、通信が失敗するような場合は、次のような感じです。
# 通信エラーが発生するURLにcurlで通信してみる!
curl -v http://httpbin.org/status/400
### 実行結果 ###
### リクエストヘッダー(Request-Header) ###
* Trying 18.207.88.57:80...
* Connected to httpbin.org (18.207.88.57) port 80 (#0)
> GET /status/400 HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.79.1
> Accept: */*
>
### レスポンスヘッダー(Response-Header) ###
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 BAD REQUEST
< Date: Fri, 23 Sep 2022 03:00:55 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 0
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
# クライエントエラーなのでレスポンスボディ(Response-Body)なし!
レスポンスヘッダー内のHTTPステータスコードが「HTTP/1.1 400 BAD REQUEST」になっており、Clientエラーで通信が失敗していることがわかります。
レスポンスヘッダー・レスポンスボディを表示する「 -i 」オプション
「 -i 」オプションは、レスポンスヘッダー(Response-Header)とレスポンスボディ(Response-Body)を表示するオプションです。
#『阿部 寛のホームページ』とGet通信の詳細情報「 -i 」
curl -i http://abehiroshi.la.coocan.jp/
### 実行結果 ###
### レスポンスヘッダー(Response-Header) ###
HTTP/1.1 200 OK
Date: Fri, 23 Sep 2022 04:49:55 GMT
Content-Type: text/html
Content-Length: 538
Connection: keep-alive
Last-Modified: Thu, 27 Feb 2020 07:10:16 GMT
ETag: "21a-59f8969af8600"
Accept-Ranges: bytes
Server: Apache
### レスポンスボディ(Response-Body) ###
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="GENERATOR" content="JustSystems Homepage Builder Version 20.0.6.0 for Windows">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>�������̃z�[���y�[�W</title>
</head>
<frameset cols=18,82>
<frame src="menu.htm" marginheight="0" marginwidth="0" scrolling="auto" name="left">
<frame src="top.htm" marginheight="0" marginwidth="0" scrolling="auto" name="right">
<noframes>
<body></body>
</noframes>
</frameset>
</html>
レスポンスヘッダーを表示する「 -I 」オプション
「 -I 」(アイ)オプションは、レスポンスヘッダー(Response-Header)を表示するオプションです。
#『阿部 寛のホームページ』とGet通信の詳細情報「 -I 」
curl -I http://abehiroshi.la.coocan.jp/
### 実行結果 ###
### レスポンスヘッダー(Response-Header) ###
HTTP/1.1 200 OK
Date: Fri, 23 Sep 2022 04:50:10 GMT
Content-Type: text/html
Content-Length: 538
Connection: keep-alive
Last-Modified: Thu, 27 Feb 2020 07:10:16 GMT
ETag: "21a-59f8969af8600"
Accept-Ranges: bytes
Server: Apache
実行結果を指定したファイルへ出力する
[ curl http://対象のURL > 出力先ファイルまでのPath ]または、
[ curl -o 出力先ファイルまでのPath http://対象のURL ]の形で実行結果をファイルに出力することができます。
# [ curl http://対象のURL > 出力先ファイルまでのPath ] の形で実行結果をファイルに出力できる
curl http://abehiroshi.la.coocan.jp/ > /Users/Robotama/Desktop/curl-Robotama/abehirosi.html
# [ curl -o 出力先ファイルまでのPath http://対象のURL ] の形で実行結果をファイルに出力できる
curl -o /Users/Robotama/Desktop/curl-Robotama/abehirosi.html http://abehiroshi.la.coocan.jp/
URLで指定したResourceを指定したファイル名でダウンロードする
# curl-Robotamaディレクトリに移動する => Download先
cd /Users/Robotama/Desktop/curl-Robotama
# 「robotama.html」と言う名前で「http://abehiroshi.la.coocan.jp/」の情報をDownloadできる。
curl -O http://abehiroshi.la.coocan.jp/robotama.html
curlコマンドのhelpを表示する
curlコマンドのhelpを見たい時には、次のコマンドで確認できます。
「 curl -h all 」ですべてのhelp情報を見たり「 curl -h カテゴリ名 」でカテゴリ毎のhelp情報を確認したりすることもできます。
# helpを表示する
curl --help
# helpを表示する Ver.省略
curl -h
# help情報をすべて表示する
curl -h all
# httpカテゴリのhelp情報を表示する => [ curl -h カテゴリ名 ]
curl -h http
# ftpカテゴリのhelp情報を表示する => [ curl -h カテゴリ名 ]
curl -h ftp
カテゴリのリストは、次のとおり。
here is a list of all categories:
auth Different types of authentication methods
connection Low level networking operations
curl The command line tool itself
dns General DNS options
file FILE protocol options
ftp FTP protocol options
http HTTP and HTTPS protocol options
imap IMAP protocol options
misc Options that don't fit into any other category
output Filesystem output
pop3 POP3 protocol options
post HTTP Post specific options
proxy All options related to proxies
scp SCP protocol options
sftp SFTP protocol options
smtp SMTP protocol options
ssh SSH protocol options
telnet TELNET protocol options
tftp TFTP protocol options
tls All TLS/SSL related options
upload All options for uploads
verbose Options related to any kind of command line output of curl
[ 翻訳 ]
すべてのカテゴリのリストは次のとおりです。
auth さまざまな種類の認証方法
接続 低レベルのネットワーク操作
curl コマンドラインツール自体
dns 一般的な DNS オプション
ファイル FILE プロトコルのオプション
ftp FTP プロトコル オプション
http HTTP および HTTPS プロトコル オプション
imap IMAP プロトコル オプション
その他 他のどのカテゴリにも当てはまらないオプション
output ファイルシステム出力
pop3 POP3 プロトコルのオプション
post HTTP Post 固有のオプション
proxy プロキシに関連するすべてのオプション
scp SCP プロトコル オプション
sftp SFTP プロトコル オプション
smtp SMTP プロトコル オプション
ssh SSH プロトコル オプション
telnet TELNET プロトコル オプション
tftp TFTP プロトコル オプション
tls TLS/SSL 関連のすべてのオプション
アップロード アップロードのすべてのオプション
verbose curl のあらゆる種類のコマンド ライン出力に関連するオプション
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!
参考・引用
- cURL(curlコマンド)とは
- 『阿部 寛のホームページ』
- curlコマンドでちょこっとHTTPリクエストを試すだけの記事
- よく使うcurlコマンドのオプション
- APIの動作を確認する方法: curlコマンドとPostman
- よく使うcurlコマンドのオプションまとめ(14個)