Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

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する

以下の例では、次のフォームデータを送信することにします。

フィールド名
field1value1
field2value2

データは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シェルやスクリプト関連の記事も、ぜひチェックしてみてください!

  1. JavaでMySQLデータベースのレコードを更新する方法【UPDATE文の使い方を実例で解説】

    MySQLデータベースのテーブルに格納されたデータを更新するには、UPDATEコマンドを使用します。本記事では、UPDATE文の基本構文から、実際にテーブルを作成し、Java(JDBC)経由でレコードを更新するまでの一連の手順を、サンプルコード付きで詳しく解説します。 UPDATE文の基本構文 MySQLで既存のデータを更新する場合、以下の構文を使用します。 update テーブル名 set カラム名1 = 値1, ....N where 条件; where句で条件を指定しないと、テーブル内のすべてのレコードが更新されてしまうため注意が必要です。 ステップ1:テーブルの作成 まずは更新用のサン

  2. JavaでMySQLデータベースのデータを削除する方法|DELETE文の使い方を徹底解説

    MySQLデータベースからデータを削除するには、DELETEコマンドを使用します。まずは基本となる構文を確認しておきましょう。 DELETE文の基本構文 delete from テーブル名 where 条件; WHERE句で条件を指定すると、該当するレコードだけをピンポイントで削除できます。逆に条件を指定しなかった場合、テーブル内の全データが削除されてしまうため、実行前には必ず条件を確認してください。 本記事では、JavaプログラムからMySQLデータベースのデータを削除する具体的な手順を解説します。はじめにサンプル用のテーブルを作成し、テストデータを挿入していきましょう。 サンプルテーブルの