cURLでPOSTリクエストを送信する方法|フォームデータ・ファイルアップロード・JSON/XML対応
cURLは、リモートサーバー間でデータを転送するためのさまざまなツールを含むパッケージです。FTP、Windows共有、メールサーバー、そしてもちろんHTTPを使用したWebサーバーへの通信に対応しています。
Linuxシェルからファイルをダウンロードする場合、通常は次のようにcURLコマンドを使用します。
curl https://example.org/file.zip --output file.zip
このコマンドはGETメソッドでファイルをリクエストし、そのままダウンロードします。
本記事では、cURLを使ってPOSTリクエストを作成する方法を詳しく解説します。フォームデータの送信方法もあわせて紹介します。これは、サーバーが認証情報を要求してファイルをダウンロードさせるケースや、Webフォームへデータを自動送信してデータベースに保存するスクリプトを構築したい場合などに役立ちます。
さらに、REST APIで利用するために、XMLやJSONデータをファイルから送信する方法についても触れます。
cURLでURLエンコードされたフィールドをPOSTする
以下の例では、次のフォームデータを送信することにします。
| フィールド名 | 値 |
|---|---|
| field1 | value1 |
| field2 | value2 |
データはhttps://example.org/submit.phpというURLに送信されます。なお、example.org上のアドレスは実際には存在せず、例として安全に使えるドメインです。submit.phpもフォーム送信スクリプトの単なる例示用の名前であり、特定のものを指すものではありません。
フォームデータは、各フィールドとその値をname=valueの形式で定義し、&で区切った1つの文字列として、--dataオプションでPOSTリクエストに渡すことができます。
curl --data "field1=value1&field2=value2" https://example.org/submit.php
しかし、この方法は必ずしも理想的ではありません。HTTPで送信できるよう、スペースやスラッシュなどを特殊なコードに置き換えたURLエンコード済みのデータが必要になるからです。手動で変換することもできますが、cURLの--data-urlencodeオプションを使えば自動的に処理してくれます。
curl --data-urlencode "field1=value1&field2=value2" https://example.org/submit.php
なお、フィールド名自体はURLエンコードされません。フィールド名もエンコードしたい場合は、先頭に=を付けてください。
curl --data-urlencode "=user name=Linus Torvalds" https://example.org
以降の例では、扱いやすさの観点から、POSTリクエストには--dataではなく--data-urlencodeを使用します。
URLエンコードされたフィールドを個別に指定する
各フォームフィールドの名前と値は、個別に渡すこともできます。こちらの方が読みやすくシンプルになります。
curl --data-urlencode "field1=value1" --data-urlencode "field2=value2" https://example.org/submit.php
cURLでのマルチパート/ファイルアップロード
ファイルを含むマルチパートフォームリクエストは、--formオプションを使ってPOSTできます。以下の例では、myfile.txtをfileuploadフォームフィールドにアップロードします。
curl --form "fileupload=@myfile.txt" https://example.org/submit.php
フィールド・ファイル・ファイル名を組み合わせたマルチパート送信
ファイルアップロード時に、フォームフィールドの名前と値のペアを一緒に送ることもできます。また、アップロードするファイルのfilename(ファイル名)を変更したい場合は、セミコロンで区切って指定できます。
curl --form "fileupload=@myfile.txt;filename=newfilename.txt" --form field1=value1 --form field2=value2 https://example.org/submit.php
データなしでPOSTリクエストを送る
データを一切含めずにPOSTリクエストを送りたい場合は、空の文字列を渡すだけです。
curl --data-urlencode '' https://example.org/submit.php
ファイルアップロードの進行状況を表示する
アップロードの進み具合を確認したい場合は、-o outputオプションを追加するとプログレスバーが表示されます。
curl --tr-encoding -X POST -v -# -o output -T myfile.dat https://example.org/submit.php
ファイルに保存されたデータを送信する
すでにファイルに保存されているデータをアップロードする場合は、内容を分解してcURLコマンドに組み込むのではなく、ファイルごと一括で送信できます。
curl --data-urlencode @myfile.txt https://example.org/submit.php
JSONやXMLデータは、適切なヘッダーを追加することで、プログラム向けのAPIサービスに対してPOSTできます。
curl -X POST --data-urlencode @myfile.txt https://example.org/submit.php --header "Content-Type:text/xml" curl -X POST --data-urlencode @myfile.txt https://example.org/submit.php --header "Content-Type:application/json"
まとめ
Linuxのコマンドラインで頻繁に作業するなら、cURLを使いこなせることは非常に重要です。プログラム向けAPIとの連携や自分のサーバーとのデータ送受信だけでなく、通常はフル機能のWebブラウザが必要になるような多くのタスクも、cURLならコマンド一つで実行できます。
その他のLinuxシェルやスクリプト関連の記事も、ぜひチェックしてみてください!
-
JavaでMySQLデータベースのレコードを更新する方法【UPDATE文の使い方を実例で解説】
MySQLデータベースのテーブルに格納されたデータを更新するには、UPDATEコマンドを使用します。本記事では、UPDATE文の基本構文から、実際にテーブルを作成し、Java(JDBC)経由でレコードを更新するまでの一連の手順を、サンプルコード付きで詳しく解説します。 UPDATE文の基本構文 MySQLで既存のデータを更新する場合、以下の構文を使用します。 update テーブル名 set カラム名1 = 値1, ....N where 条件; where句で条件を指定しないと、テーブル内のすべてのレコードが更新されてしまうため注意が必要です。 ステップ1:テーブルの作成 まずは更新用のサン
-
JavaでMySQLデータベースのデータを削除する方法|DELETE文の使い方を徹底解説
MySQLデータベースからデータを削除するには、DELETEコマンドを使用します。まずは基本となる構文を確認しておきましょう。 DELETE文の基本構文 delete from テーブル名 where 条件; WHERE句で条件を指定すると、該当するレコードだけをピンポイントで削除できます。逆に条件を指定しなかった場合、テーブル内の全データが削除されてしまうため、実行前には必ず条件を確認してください。 本記事では、JavaプログラムからMySQLデータベースのデータを削除する具体的な手順を解説します。はじめにサンプル用のテーブルを作成し、テストデータを挿入していきましょう。 サンプルテーブルの