curl は、さまざまなネットワークプロトコルを使用してデータを転送するためのコマンドラインツールです。curlはすべての主要なオペレーティングシステムで利用でき、コマンドラインからHTTPリクエストを送信するための標準ツールとなっています。
curlのクロスプラットフォームユーティリティは、HTTP、HTTPS、FTP、IMAP などのプロトコルをサポートしているため、APIにリクエストを送信したり、 curlを使用して簡単にウェブスクレイピングしたりできます。curlは幅広く利用可能で複数のプロトコルをサポートしているため、コマンドラインから直接API呼び出しをすばやくテストする方法として、REST APIのドキュメントでcurlが参照されていることがよくあります。
この記事では、コマンドラインからcurlを使用してPOSTリクエストを送信する方法をご説明します。
POSTリクエストとは
POSTリクエストはサーバーにデータを送信するHTTPメソッドであり、最も一般的なHTTPメソッドの一つです。
POSTリクエストを送信すると、送信されたデータはリクエスト本文に含まれます。これにより、(GETリクエストのように) URLで送信するよりも目立たない形でデータを送信できます。また、ブラウザがGETリクエストに対して課しているURLの長さの制限を回避することで、POSTリクエストで送信するデータの量を大幅に増やすこともできます。
POSTリクエストは、フォームの送信、ファイルのアップロード、またはAPIへのJSONデータの送信に使用されることがよくあります。GETと比較すると、POSTリクエストは通常キャッシュされず、リクエストデータはリクエストの本文にあるため、データはブラウザの履歴に表示されません。
curlでPOSTリクエストを送信する方法
このチュートリアルを始める前に、curlをコンピュータにインストールしてください。次のコマンドを実行して、curl がインストールされているかどうかを確認します。
curl --version
コマンドが見つからなかったというエラーが表示された場合は、ユーティリティをインストールする必要があります。
curlをインストールします
すべての主要なオペレーティングシステムにcurlをインストールする方法の手順は以下のとおりです。
Windows
Windowsでは、Windows 11のデフォルトパッケージマネージャーであるWinGetを使用してcurlをインストールできます。
winget install curl.curl
curlをインストールできるもう一つのWindows用パッケージマネージャーであるChocolateyでは、次のコマンドを使用します。
choco install curl
Linux
curlはほとんどのLinuxパッケージマネージャーで使用できます。 Ubuntu/Debianでは、次のコマンドを使用してcurlをインストールしてください:
apt-get install curl
Red Hat Enterprise Linux (RHEL)、CentOS、Fedoraでは、次のようにYellowdog Updater Modified (YUM) を使用してcurlをインストールできます。
yum install curl
OpenSUSEを実行している場合は、次のターミナルコマンドを使用してcurlをインストールできます。
zypper install curl
最後に、Arch Linuxの場合はpacmanを使って次のコマンドでcurlをインストールできます。
pacman -Sy curl
macOS
Homebrewは、macOSにcurlをインストールする最も簡単な方法です。Homebrew がインストールされていることを確認し、次のコマンドを実行します。
brew install curl
オペレーティングシステムにcurlをインストールすれば、POSTリクエストの実行方法を学ぶ準備完了です。
POSTリクエストを作成
curlでは、POSTリクエストを送信する際にいくつかのオプションを指定できます。以下のセクションでは、ユーティリティを使用してPOSTリクエストを行うときに遭遇する可能性のある一般的なcurl機能をいくつかご紹介します。
POSTメソッドを指定
curlを使用してHTTPリクエストを行う場合は、実行するHTTPメソッドを指定する必要があります。HTTPメソッドには、GET、POST、PUT、DELETEが含まれます。curl では、-X
コマンドラインフラグを使用して、使用するHTTPメソッドを指定できます。
たとえば、https://httpbin.org/anything
に POSTリクエストを送信するには、ターミナルで次のcurlコマンドを実行できます。
curl -X POST https://httpbin.org/anything
httpbin.orgは、リクエスト本文とヘッダーをレスポンスにエコーします。応答は次のようになります。
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
-X POST
フラグは--request POST
フラグを使用するのと同じであるため、次のコマンドを実行しても同じ結果が得られます。
curl --request POST https://httpbin.org/anything
応答は前の応答と同じように表示されます。
-X
と--request
フラグの詳細については、公式ドキュメントを参照してください。
コンテンツタイプを設定
POSTリクエストを送信する場合、サーバーがリクエスト本文を正しく解釈できるように、送信するコンテンツの種類をリクエストの本文で指定することが重要です。HTTP リクエストのContent-Type
ヘッダーでMIME タイプを使用して、リクエスト本文の形式を指定できます。
たとえば、リクエスト本文でJSONを送信する場合は、Content-Type
ヘッダーをapplication/json
に設定して、JSONコンテンツを期待するようにウェブサーバーに指示する必要があります。XMLを送信する場合、Content-Type
ヘッダーはapplication/xml
である必要があります。詳細については、Content-Type
について説明している公式ドキュメントをご参照ください。
curlでは、-H
フラグを使用してHTTPリクエストのヘッダーを指定できます。例として、POSTリクエストでJSONを送信する場合、次のcurlコマンドは、リクエストのContent-Type
ヘッダーを設定する方法を示しています。
curl -X POST -H 'Content-Type: application/json' -d '{}' https://httpbin.org/anything
レスポンスでは、Content-Type
ヘッダーがapplication/json
に設定されていることがわかります。
{
"args": {},
"data": "{}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "2",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=-11111111-111111111111111111111111"
},
"json": {},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
-H
フラグは、長い--header
フラグを使用して指定することもできます。この場合、curlコマンドは次のようになります。
curl -X POST --header 'Content-Type: application/json' -d '{}' https://httpbin.org/anything
レスポンスは前のものと同じになります。
送信データ
以前のコマンドに-d
フラグがあったことにお気づきかもしれません。このフラグでは、送信するデータをリクエスト本文で指定できます。このフラグを使用すると、引用符で囲まれた任意の値の文字列を渡すことができます。
curl -X POST -H 'Content-Type: application/json' -d '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
httpbin.orgには、送信した本文データが応答のデータ
プロパティに表示されていることがわかります。
curlが本文で送信したいデータを含むファイルがある場合は、ファイル名の前に@
マークを付けて指定してください。次のコマンドは、body.json
の内容を読み取り、リクエスト本文を介して送信します。
curl -X POST -H 'Content-Type: application/json' -d @body.json https://httpbin.org/anything
この場合、body.json
ファイルには以下が含まれます。
{
"FirstName": "Joe",
"LastName": "Soap"
}
これを送信すると、httpbin.orgは次の応答を返すはずです。
{
"args": {},
"data": "{\t\"FirstName\": \"Joe\",\t\"LastName\": \"Soap\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
--data
フラグは-d
と同じように動作するため、同じように使用できます。
JSONデータを送信
前のセクションでは、Content-Type
ヘッダーをapplication/json
に設定し、-d
フラグを使用してJSONデータを渡す方法についてご説明しました。リクエストを送信するときは、レスポンスでどのような形式のデータが必要かをウェブサーバーに知らせることも重要です。Accept
ヘッダーにapplication/json
という値を指定すると、JSONレスポンスを受信したいことをウェブサーバーに通知できます。
次のコマンドは、JSONリクエストをサーバーに送信し、応答としてJSONを受信することをサーバーに通知します。
curl -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
レスポンス本文のデータ
とjson
プロパティには、リクエストで送信したJSONデータが含まれていることがわかります。
{
"args": {},
"data": "{\n \"FirstName\": \"Joe\",\n \"LastName\": \"Soap\"\n}",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Content-Length": "50",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
JSONデータの送受信はHTTPリクエストを送信する際によく行われるため、curlにはContent-Type
とAccept
ヘッダーを設定し、リクエスト本文にJSONデータを送信する--json
フラグが用意されています。このフラグを使用すると、POSTリクエストでJSONを送信するコマンドを短縮できます:
curl -X POST --json '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
これにより、以前と同じ応答が得られます:
{
"args": {},
"data": "{\n \"FirstName\": \"Joe\",\n \"LastName\": \"Soap\"\n}",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Content-Length": "50",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
--json
フラグは、2022年3月にcurlのバージョン7.82でリリースされたため、使用する前に最新バージョンのcurlがインストールされていることを確認してください。
XMLデータを送信
curlでは、XMLなどの他の形式でデータを送信することもできます。XMLデータを送信するには、Content-Type
ヘッダーをapplication/xml
に設定し、-d
フラグを使用してXMLデータをリクエスト本文に渡す必要があります。Accept
ヘッダーをapplication/xml
に設定することで、応答がXMLであることを期待していることをWebサーバーに伝えることもできます。
次のコマンドは、curlを使用してPOSTリクエストでXMLオブジェクトを送信する方法をご説明します。
curl -X POST -H 'Content-Type: application/xml' -H 'Accept: application/xml' -d '<Person>
<FirstName>Joe</FirstName>
<LastName>Soap</LastName>
</Person>' https://httpbin.org/anything
XMLリクエストデータは、httpbin.orgによって返されるデータ
プロパティにあります:
{
"args": {},
"data": "<Person>\n <FirstName>Joe</FirstName>\n <LastName>Soap</LastName>\n</Person>",
"files": {},
"form": {},
"headers": {
"Accept": "application/xml",
"Content-Length": "79",
"Content-Type": "application/xml",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
FormDataを送信
FormData
を使用して、キーと値のペアのデータをWebサーバーに送信できます。名前が示すように、このデータ形式はWebページでフォームを送信するときに使用します。キーと値のペアにはフィールド名と値があります。
curlでは、-F
または--form
フラグを使ってFormData
を指定できます。フラグを使用するときは、フィールド名と値を次の形式で指定します。-F
または--form
。
次のスニペットは、FormData
を使用してPOSTリクエストを送信するcurlコマンドを示しています。名
と姓
フィールド:
curl -X POST -F FirstName=Joe -F LastName=Soap https://httpbin.org/anything
フォームフィールド名と値は、httpbin.orgレスポンスオブジェクトのフォーム
プロパティにあります:
{
"args": {},
"data": "",
"files": {},
"form": {
"FirstName": "Joe",
"LastName": "Soap"
},
"headers": {
"Accept": "*/*",
"Content-Length": "248",
"Content-Type": "multipart/form-data; boundary=------------------------e2bb56049a60b8b8",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
サーバーに送信するすべてのフィールドに-F
フラグを使用します。
ファイルのアップロード
FormData
を使用して、ファイルをフィールドに添付することでPOSTリクエストでファイルをアップロードできます。curlにFormData
フィールドにファイルが格納されていることを知らせるには、@
マークをプレフィックスとするフィールド値にファイルへのパスを入力します。
次のcurlコマンドは、作業ディレクトリにContract.pdf
というファイルをアップロードします。このコマンドは、File
というフィールドを使用してファイルをアップロードします:
curl -X POST -F [email protected] https://httpbin.org/anything
応答にはファイル全体が含まれているため、長いですが、次のようになるはずです。
{
"args": {},
"data": "",
"files": {
"File": "..."
},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "246",
"Content-Type": "multipart/form-data; boundary=------------------------19ed1fc3be4d30c7",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
認証情報の送信
多くのHTTPエンドポイントでは、リクエストを送信するために認証が必要です。Webサーバーは、どの認証方法を使用するかを決定します。そのような認証方法の一つが基本認証スキームです。この方法では、リクエストでユーザー名とパスワードで構成される認証情報を送信できます。その後、サーバーは認証情報を検証し、正しければリクエストを処理します。
curlは、-u
または--user
フラグを使用して基本認証情報を簡単に送信できます。次に、ユーザー名とパスワードを指定し、次のように:
(コロン) で区切ります。-u
。
次のスニペットは、curlを使用してユーザー認証情報とJSON 本文を含むPOSTリクエストを送信しています。
curl -X POST -u 'admin:password123' --json '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
curlがユーザー名とパスワードをエンコードして認証
ヘッダーに送信する方法に注目してください。
{
"args": {},
"data": "{\n \"FirstName\": \"Joe\",\n \"LastName\": \"Soap\"\n}",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Authorization": "Basic YWRtaW46cGFzc3dvcmQxMjM=",
"Content-Length": "50",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
まとめ
この記事では、curlコマンドラインユーティリティを使用してPOSTリクエストを送信する方法をご説明しました。まず、-X
フラグを使用してPOSTリクエストを送信することを指定する方法を学びました。また、-H
と--header
フラグを使用してContent-Type
とAccept
ヘッダーを設定し、Webサーバーがデータの形式を認識できるようにもしました。リクエスト本文のデータを送信するには、送信したいデータとともに-d
フラグを使用しました。
さらに、JSON、XML、FormData
など、複数のタイプのデータを送信する方法の例をいくつか見て、-u
と--user
フラグを使用してリクエストで基本認証情報を送信する方法を学びました。
この記事ではcurlに含まれる基本的なフラグとその使用方法についてご説明しましたが、curlには、変数を使用する、リクエストでCookieを送信する、プロキシを使用してリクエストを送信するなど、調べてみたくなる機能が他にもあります。Python、Node.js、Rust など、多くのプログラミング言語には、そのプログラミング言語のcurlを操作できるライブラリも用意されています。
スクレイピングソリューションをお探しですか?弊社のデータ専門家にご相談の上、お客様のニーズに最適な製品を見つけてください。
クレジットカードは必要ありません