curlコマンドの使い方 Get・Post・REST-API通信とオプションの使い方(HTTPリクエスト)

curlコマンド

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、Linuxコマンドの1つであるcurlコマンドについて解説していきます。

curlコマンドとは?

curl とは、サーバーにリクエストを送信し、レスポンスを受け取る操作ができるLinuxコマンドです。

HTTP以外でもプロトコルを指定することができ、インターネット上で使用されるプロトコルの多くに対応しています。

正式名称は「client for URL」略して「curl」で、読み方は「カール」です。

cURL 【client for URL】 curlコマンド

cURLとは、主にUNIX系OSでよく利用されるコマンドおよびプログラムの一つで、

様々なプロトコル(通信手順)を用いてURLで示されるネットワーク上の場所との間でデータの送受信を行うもの。

オープンソースソフトウェアとして公開されている。

コマンドラインツールの一種で、シェルなどから “curl” というコマンドに続けてダウンロードしたいURLやオプションなどを記述して実行することで、

その場所からファイルを取得して表示したり、ファイルとして保存することができる。

URLで指定した場所にファイルをアップロードすることもできる。

インターネット上で使用される主要なプロトコルの多くに対応しており、

HTTPやFTPTelnetSMTPPOP3IMAPTFTPLDAPなどと、

これらとSSL/TLSの組み合わせ(HTTPSFTPSSFTPPOP3SIMAPSLDAPSなど)が利用できる。

また、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–dataPOSTリクエストで送信するデータを指定する
-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ヘルプを表示する
【 curlのよく使うオプション一覧 】

通信の詳細情報をすべて出力する「-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!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

参考・引用

  1. cURL(curlコマンド)とは 
  2. 『阿部 寛のホームページ』
  3. curlコマンドでちょこっとHTTPリクエストを試すだけの記事
  4. よく使うcurlコマンドのオプション
  5. APIの動作を確認する方法: curlコマンドとPostman
  6. よく使うcurlコマンドのオプションまとめ(14個)

Linux関連書籍

最近の投稿