curl POSTリクエストガイド

cURL POSTリクエスト、その概要、cURLでPOSTリクエストを送信する方法などについて学びましょう。
4 min read
curl post request guide

curl は、さまざまなネットワークプロトコルを使用してデータを転送するためのコマンドラインツールです。curlはすべての主要なオペレーティングシステムで利用でき、コマンドラインからHTTPリクエストを送信するための標準ツールとなっています。

curlのクロスプラットフォームユーティリティは、HTTP、HTTPS、FTP、IMAP などのプロトコルをサポートしているため、APIにリクエストを送信したり、 curlを使用して簡単にウェブスクレイピングしたりできます。curlは幅広く利用可能で複数のプロトコルをサポートしているため、コマンドラインから直接API呼び出しをすばやくテストする方法として、REST APIのドキュメントでcurlが参照されていることがよくあります。

コマンドラインからcurlを使用してPOSTリクエストを送信する方法を学びましょう

この記事では、コマンドラインから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-TypeAcceptヘッダーを設定し、リクエスト本文に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-TypeAcceptヘッダーを設定し、Webサーバーがデータの形式を認識できるようにもしました。リクエスト本文のデータを送信するには、送信したいデータとともに-dフラグを使用しました。

さらに、JSON、XML、FormDataなど、複数のタイプのデータを送信する方法の例をいくつか見て、-u--userフラグを使用してリクエストで基本認証情報を送信する方法を学びました。

この記事ではcurlに含まれる基本的なフラグとその使用方法についてご説明しましたが、curlには、変数を使用する、リクエストでCookieを送信する、プロキシを使用してリクエストを送信するなど、調べてみたくなる機能が他にもあります。Python、Node.js、Rust など、多くのプログラミング言語には、そのプログラミング言語のcurlを操作できるライブラリも用意されています。

スクレイピングソリューションをお探しですか?弊社のデータ専門家にご相談の上、お客様のニーズに最適な製品を見つけてください。