curlコマンドでAPI呼び出し実践

curlコマンドでAPI呼び出し実践:HTTPリクエストの基本から応用まで完全ガイド
curlコマンドを使ってAPIを呼び出す際は、HTTPメソッドとエンドポイントURLを正確に指定し、適切なヘッダーと認証情報を設定することが成功の鍵です。単純なGETリクエストからPOST/PUT/DELETEまで、curlの基本構文をマスターすれば、どんなAPIでも自在に操作できるようになります。
本記事では、curlコマンドによるAPI呼び出しの基本から応用テクニックまで、実務で即座に活用できる具体的な手法を網羅的に解説します。HTTPステータスコードの正しい解釈方法、JSONデータの送受信、認証トークンの扱い方、さらにはデバッグ手法まで、実践的なノウハウを余すところなく紹介します。curlコマンドを使ったAPI連携作業の効率を劇的に向上させたいエンジニア必見の内容です。
目次
- curlコマンドの基本構文とインストール方法
- GETリクエストでデータを取得する基本操作
- POST/PUT/DELETEでデータを操作する応用テクニック
- HTTPヘッダーと認証情報の正しい設定方法
- レスポンスの解析とデバッグ手法
- curlを活用した自動化とベストプラクティス
- curlコマンドのトラブルシューティング完全ガイド
- よくある質問と回答
- まとめ:curlコマンドでAPI連携をマスターしよう
curlコマンドの基本構文とインストール方法
curlとは何か:HTTP…
curlは、Command Line URL(コマンドラインURL)の略称で、さまざまなプロトコル(HTTP、HTTPS、FTP、SMTPなど)をサポートしたコマンドラインツールです。API呼び出しにおいては、HTTP/HTTPSプロトコルを使用してサーバーと通信する際に最も一般的に利用されるツールとなっています。
curlの主な特徴は以下の通りです:
- HTTPメソッド(GET、POST、PUT、DELETE、PATCHなど)を完全にサポート
- リクエストヘッダーとボディの柔軟な設定が可能
- 認証情報(Basic認証、Bearerトークン、OAuthなど)の扱いに優れている
- レスポンスデータの出力形式をカスタマイズ可能
- Windows、macOS、Linuxなど主要なOSで動作する
- スクリプトや自動化に適したコマンドラインインターフェース
curlは、API開発者、システムエンジニア、DevOpsエンジニアにとって、APIの動作確認やテスト、自動化スクリプトの作成に欠かせないツールです。特に、GUIツールを使わずにコマンドラインだけでAPIの動作を確認できる点が大きなメリットです。
curlのインストール方法…
curlはほとんどのLinuxディストリビューションとmacOSに標準でインストールされていますが、最新バージョンを使用するためには手動でインストールすることをお勧めします。Windows環境では、公式のインストーラーを使用するか、WSL(Windows Subsystem for Linux)経由でLinux版を利用する方法が一般的です。
| OS | インストール方法 | 確認コマンド |
|---|---|---|
| Linux(Debian/Ubuntu系) | sudo apt update && sudo apt install curl | curl –version |
| Linux(RHEL/CentOS系) | sudo yum install curl | curl –version |
| macOS | Homebrew経由:brew install curl または公式サイトからダウンロード | curl –version |
| Windows | 公式サイト(https://curl.se/windows/)からダウンロード またはWSL経由でLinux版を利用 | curl –version |
最新バージョンを使用することで、最新のセキュリティ機能やパフォーマンス最適化を享受できます。特に、HTTP/2やHTTP/3のサポート状況を確認する際には、バージョン情報を確認しておくと良いでしょう。
curlの基本構文とオプシ…
curlの基本的な構文は以下の通りです:
curl [options] [URL]主なオプションは以下の通りです:
| オプション | 説明 | 使用例 |
|---|---|---|
| -X, –request | HTTPメソッドを指定(GET, POST, PUT, DELETEなど) | curl -X POST https://api.example.com/data |
| -H, –header | リクエストヘッダーを追加 | curl -H “Content-Type: application/json” https://api.example.com |
| -d, –data | リクエストボディに送信するデータを指定 | curl -X POST -d ‘{“name”:”John”}’ https://api.example.com/users |
| -u, –user | Basic認証のユーザー名とパスワードを指定 | curl -u username:password https://api.example.com |
| -b, –cookie | Cookieを送信 | curl -b “session=abc123” https://api.example.com |
| -c, –cookie-jar | 受信したCookieをファイルに保存 | curl -c cookies.txt https://api.example.com |
| -v, –verbose | 詳細なデバッグ情報を出力 | curl -v https://api.example.com |
| -i, –include | レスポンスヘッダーを含めて出力 | curl -i https://api.example.com |
| -o, –output | レスポンスをファイルに保存 | curl -o response.json https://api.example.com/data.json |
| -w, –write-out | レスポンス情報をカスタマイズして出力 | curl -w “%{http_code}” https://api.example.com |
これらのオプションを組み合わせることで、さまざまなAPI呼び出しシナリオに対応できます。特に、-v(verbose)オプションは、リクエストとレスポンスの詳細を確認できるため、APIのデバッグに非常に有効です。
curlのバージョン確認と…
curlのバージョンを確認するには、以下のコマンドを実行します:
curl --versionこのコマンドを実行すると、curlのバージョン情報だけでなく、サポートされているプロトコルや機能の一覧も表示されます。例えば、以下のような出力が得られます:
curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3
Release-Date: 2022-01-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB SPNEGO SSL TLS-SRP UnixSockets zstdこの出力から、HTTP/2やHTTP/3(alt-svc)、圧縮機能(brotli、zstd)などのサポート状況を確認できます。最新の機能を利用するためには、定期的にアップデートすることをお勧めします。
Linux環境でのアップデート方法は以下の通りです:
- Debian/Ubuntu系:sudo apt update && sudo apt upgrade curl
- RHEL/CentOS系:sudo yum update curl
- macOS(Homebrew経由):brew update && brew upgrade curl
Windows環境では、公式サイトから最新のインストーラーをダウンロードして実行するか、Chocolateyパッケージマネージャーを使用してアップデートできます。
GETリクエストでデータを取得する基本操作
GETリクエストの基本構文…
GETリクエストは、サーバーからデータを取得する際に使用されるHTTPメソッドです。curlを使ったGETリクエストの基本的な構文は以下の通りです:
curl [URL]例えば、以下のようなコマンドを実行すると、指定したURLからデータを取得できます:
curl https://jsonplaceholder.typicode.com/posts/1このコマンドを実行すると、以下のようなJSONレスポンスが返されます:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}GETリクエストでは、URLにクエリパラメータを追加して、特定の条件でデータを取得することもできます。例えば、以下のようなコマンドを実行すると、userIdが1の投稿を取得できます:
curl "https://jsonplaceholder.typicode.com/posts?userId=1"クエリパラメータを含むURLをコマンドラインで実行する際は、ダブルクォーテーションで囲むことをお勧めします。これは、シェルによって特殊文字が解釈されるのを防ぐためです。
レスポンスの出力形式を制御…
curlのデフォルトの出力形式は、レスポンスボディのみが表示されます。しかし、APIのデバッグや処理においては、レスポンスヘッダーやステータスコード、実行時間などの情報も重要です。これらの情報を表示するためのオプションを紹介します。
レスポンスヘッダーを含める(-iオプション)
レスポンスヘッダーを含めて出力するには、-iオプションを使用します:
curl -i https://jsonplaceholder.typicode.com/posts/1このコマンドを実行すると、以下のような出力が得られます:
HTTP/2 200
date: Mon, 15 Apr 2024 12:34:56 GMT
content-type: application/json; charset=utf-8
content-length: 292
x-powered-by: Express
etag: W/"124-..."
cache-control: public, max-age=14400
vary: Origin, Accept-Encoding
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}レスポンスヘッダーには、HTTPステータスコード(200 OK)、Content-Type、Content-Length、Cache-Controlなどの重要な情報が含まれています。これらの情報は、APIの動作を理解する上で非常に重要です。
レスポンスヘッダーのみを表示(-Iオプション)
レスポンスボディを表示せず、ヘッダーのみを表示するには、-Iオプション(大文字のアイ)を使用します:
curl -I https://jsonplaceholder.typicode.com/posts/1このコマンドを実行すると、以下のような出力が得られます:
HTTP/2 200
date: Mon, 15 Apr 2024 12:34:56 GMT
content-type: application/json; charset=utf-8
content-length: 292
x-powered-by: Express
etag: W/"124-..."
cache-control: public, max-age=14400
vary: Origin, Accept-Encodingこのオプションは、HEADリクエストと同様に動作し、サーバーのヘッダー情報のみを取得できます。主に、サーバーの状態を確認する際に使用されます。
レスポンスをファイルに保存(-oオプション)
レスポンスをファイルに保存するには、-oオプションを使用します:
curl -o response.json https://jsonplaceholder.typicode.com/posts/1このコマンドを実行すると、レスポンスがresponse.jsonというファイルに保存されます。ファイルに保存することで、後からデータを解析したり、別のツールで処理したりすることができます。
また、-Oオプション(大文字のオー)を使用すると、レスポンスのファイル名をURLのファイル名と同じにすることができます:
curl -O https://jsonplaceholder.typicode.com/posts/1このコマンドを実行すると、レスポンスがposts/1というファイルに保存されます。
HTTPステータスコードの…
HTTPステータスコードは、サーバーからのレスポンスの状態を示す3桁の数字です。API呼び出しにおいては、ステータスコードを正しく解釈することが、エラーの原因を特定する上で非常に重要です。主なHTTPステータスコードとその意味は以下の通りです:
| ステータスコード | 分類 | 意味 | 一般的な対応 |
|---|---|---|---|
| 200 | 成功 | リクエストが成功し、レスポンスが返された | レスポンスボディを処理 |
| 201 | 成功 | リソースが作成された(POSTリクエストの成功時) | 作成されたリソースのURLを確認 |
| 204 | 成功 | リクエストは成功したが、レスポンスボディはない | レスポンスヘッダーを確認 |
| 400 | クライアントエラー | リクエストに問題がある(不正なパラメータなど) | リクエスト内容を確認 |
| 401 | クライアントエラー | 認証が必要(ユーザー認証に失敗) | 認証情報を確認 |
| 403 | クライアントエラー | リソースへのアクセスが拒否された | 権限を確認 |
| 404 | クライアントエラー | リソースが見つからない | URLやパラメータを確認 |
| 405 | クライアントエラー | 指定したHTTPメソッドが許可されていない | 使用するHTTPメソッドを確認 |
| 429 | クライアントエラー | リクエストが多すぎる(レート制限) | リクエスト回数を減らす |
| 500 | サーバーエラー | サーバー内部でエラーが発生 | サーバーのログを確認 |
| 502 | サーバーエラー | ゲートウェイまたはプロキシでエラーが発生 | ネットワークやプロキシを確認 |
| 503 | サーバーエラー | サービスが一時的に利用できない | サービスの状態を確認 |
| 504 | サーバーエラー | ゲートウェイタイムアウト | サーバーの応答時間を確認 |
curlを使ってAPI呼び出しを行う際には、レスポンスのステータスコードを確認することが非常に重要です。例えば、以下のコマンドを実行すると、ステータスコードのみを出力できます:
curl -s -o /dev/null -w "%{http_code}" https://jsonplaceholder.typicode.com/posts/1このコマンドを実行すると、レスポンスのステータスコード(例:200)のみが出力されます。-sオプションはサイレントモード(進捗表示を非表示)、-o /dev/nullはレスポンスボディを/dev/nullに送信(破棄)、-w “%{http_code}”はステータスコードを出力するという設定です。
ステータスコードを確認することで、API呼び出しが成功したかどうか、あるいはどのようなエラーが発生したかを迅速に判断できます。
JSONデータのフォーマッ…
APIから返されるJSONデータは、通常は1行で出力されますが、人間が読みやすいように整形することができます。そのために、jqというコマンドラインツールを使用します。
jqは、JSONデータを解析・整形するための軽量なコマンドラインツールで、以下のようにインストールできます:
- Linux(Debian/Ubuntu系):sudo apt install jq
- Linux(RHEL/CentOS系):sudo yum install jq
- macOS:brew install jq
- Windows:公式サイト(https://stedolan.github.io/jq/)からダウンロード
jqを使ってJSONデータを整形するには、以下のように実行します:
curl https://jsonplaceholder.typicode.com/posts/1 | jqこのコマンドを実行すると、以下のような整形されたJSONが出力されます:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}jqを使うことで、JSONデータを視覚的に確認しやすくなり、APIのレスポンスを理解する上で非常に有効です。また、jqを使って特定のフィールドのみを抽出することもできます:
curl https://jsonplaceholder.typicode.com/posts/1 | jq '.title'このコマンドを実行すると、タイトルのみが出力されます:
"sunt aut facere repellat provident occaecati excepturi optio reprehenderit"jqは、API開発において非常に強力なツールであり、curlと組み合わせることで、APIのテストやデバッグを効率的に行うことができます。
POST/PUT/DELETEでデータを操作する応用テクニック
POSTリクエストでデータ…
POSTリクエストは、サーバーに新しいリソースを作成する際に使用されるHTTPメソッドです。curlを使ったPOSTリクエストの基本的な構文は以下の通りです:
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' [URL]例えば、以下のコマンドを実行すると、新しいユーザーを作成できます:
curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe", "email":"john@example.com"}' https://jsonplaceholder.typicode.com/usersこのコマンドを実行すると、以下のようなレスポンスが返されます:
{
"name": "John Doe",
"email": "john@example.com",
"id": 11
}POSTリクエストでは、以下の点に注意する必要があります:
- Content-Typeヘッダーをapplication/jsonに設定する
- リクエストボディにJSON形式のデータを指定する
- -X POSTオプションを明示的に指定する(省略可能な場合もあるが、明示することを推奨)
リクエストボディにJSONデータを指定する際は、シングルクォーテーションで囲むことをお勧めします。これは、ダブルクォーテーションがJSON構文に使用されるためです。
PUTリクエストでデータを…
PUTリクエストは、既存のリソースを完全に置き換える際に使用されるHTTPメソッドです。curlを使ったPUTリクエストの基本的な構文は以下の通りです:
curl -X PUT -H "Content-Type: application/json" -d '{"key":"updated_value"}' [URL]例えば、以下のコマンドを実行すると、IDが1のユーザー情報を更新できます:
curl -X PUT -H "Content-Type: application/json" -d '{"name":"John Updated", "email":"john.updated@example.com"}' https://jsonplaceholder.typicode.com/users/1このコマンドを実行すると、以下のようなレスポンスが返されます:
{
"id": 1,
"name": "John Updated",
"email": "john.updated@example.com",
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org"
}PUTリクエストでは、以下の点に注意する必要があります:
- リソースのIDを含む完全なURLを指定する
- リクエストボディに更新後のデータを完全に含める
- Content-Typeヘッダーをapplication/jsonに設定する
PUTリクエストは、既存のリソースを完全に置き換えるため、リクエストボディにはリソースの全てのフィールドを含める必要があります。一部のフィールドのみを更新したい場合は、PATCHリクエストを使用します。
DELETEリクエストでデ…
DELETEリクエストは、既存のリソースを削除する際に使用されるHTTPメソッドです。curlを使ったDELETEリクエストの基本的な構文は以下の通りです:
curl -X DELETE [URL]例えば、以下のコマンドを実行すると、IDが1のユーザーを削除できます:
curl -X DELETE https://jsonplaceholder.typicode.com/users/1このコマンドを実行すると、以下のようなレスポンスが返されます:
{}DELETEリクエストでは、以下の点に注意する必要があります:
- 削除対象のリソースのIDを含む完全なURLを指定する
- リクエストボディは通常不要(ただし、一部のAPIでは必要な場合もある)
- 削除が成功すると、多くの場合204 No Contentステータスコードが返される
DELETEリクエストを実行した際のレスポンスは、APIによって異なります。一部のAPIでは、削除されたリソースの情報が返される場合もあります。レスポンスのステータスコードを確認することで、削除が成功したかどうかを判断できます。
リクエストボディの種類とC…
API呼び出しにおいて、リクエストボディの種類とContent-Typeヘッダーの設定は非常に重要です。主なContent-Typeとその対応するデータ形式は以下の通りです:
| Content-Type | データ形式 | 使用例 |
|---|---|---|
| application/json | JSON形式 | curl -H “Content-Type: application/json” -d ‘{“key”:”value”}’ [URL] |
| application/x-www-form-urlencoded | URLエンコード形式 | curl -H “Content-Type: application/x-www-form-urlencoded” -d “key=value” [URL] |
| multipart/form-data | ファイルアップロードなど | curl -H “Content-Type: multipart/form-data” -F “file=@test.jpg” [URL] |
| text/plain | プレーンテキスト | curl -H “Content-Type: text/plain” -d “plain text” [URL] |
| application/xml | XML形式curl -H “Content-Type: application/xml” -d ‘<key>value</key>’ [URL] |
最も一般的に使用されるContent-Typeはapplication/jsonです。JSON形式のデータは、人間が読みやすく、機械的な処理にも適しているため、API呼び出しにおいてデファクトスタンダードとなっています。
URLエンコード形式(application/x-www-form-urlencoded)は、フォームデータの送信などに使用されます。例えば、以下のようなコマンドを実行すると、フォームデータを送信できます:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "name=John&email=john@example.com" https://example.com/apiファイルアップロードなど、バイナリデータを送信する際には、multipart/form-data形式を使用します。例えば、以下のようなコマンドを実行すると、ファイルをアップロードできます:
curl -X POST -H "Content-Type: multipart/form-data" -F "file=@test.jpg" https://example.com/uploadContent-Typeの設定を間違えると、API側でリクエストを正しく処理できず、エラーが発生する可能性があります。APIのドキュメントを確認して、適切なContent-Typeを設定するようにしましょう。
リクエストボディにファイル…
curlを使って、リクエストボディにファイルの内容を使用することができます。これは、大量のデータや構造化されたデータを扱う際に非常に便利です。例えば、以下のようなコマンドを実行すると、ファイルの内容をリクエストボディとして送信できます:
curl -X POST -H "Content-Type: application/json" --data-binary "@data.json" https://example.com/apiこのコマンドでは、–data-binaryオプションを使用して、ファイルの内容をリクエストボディとして送信しています。@data.jsonという形式で
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。




