コマンドラインからHTTPのデータ送信をするのに便利な curl コマンド。 筆者は頻繁に利用するわりに、コマンドを記憶しておらず、いつもコピペに頼っているので、そんな自分のためにも、ここに利用方法をまとめておきたいと思います。 本項ではPOSTメソッドでデータを送信する方法をまとめて整理します。 データをPOSTすると言っても、一般的なPOSTから、JSON形式、XML形式 だったり、ファイルを送信したい場合もあるため、それぞれについてまとめます。
送信データなし
送信するデータがないPOSTメソッドでのリクエストは、HTTPのリクエストメソッドをPOSTにする -X POST オプションをつけてエンドポイントのURLを指定すればOKです。
$ curl -X POST https://xxxxx.net/xxxxxx
一般的な Web Form 同様の POST (application/x-www-form-urlencoded)
一般的なWEBページのフォームなどから文字列データを送信するのと同等のPOSTをしたい場合は-d (省略しない場合は –data)もしくは –data-urlencode オプションを利用します。 -d オプションは指定された文字列データをそのまま送信します。 もし日本語文字列などをURLエンコードして送信する必要がある場合は –data-urlencode オプションを利用します。 オプションに渡す値の形としては 変数名=値 の形式で値を指定します。
$ curl -X POST --data-urlencode 'name=太郎' -d 'age=30' https://xxxxx.net/xxxxxx
ファイルの送信 (multipart/form-data)
ファイルをPOSTする方法についても解説します。
変数としてファイルを送信する
WEBページのフォームなどのように、変数名に紐づく形でファイルを送信したい場合は -F オプションで送信したいファイルを指定します。 ファイルは @ファイル名 という形で指定します。 (次の例では変数名を file1 としてファイル /var/tmp/sample.jpg を送信しています)
$ curl -X POST -F file1=@/var/tmp/sample.jpg https://xxxxx.net/xxxxxx
文字列とファイルを同時に送信する
文字列のデータと、ファイルのデータを同時にPOSTしたい場合もあります。 その場合、送信したい全てのデータを -F (もしくは –form)オプションで指定します。 実は -F オプションを利用した場合は、HTTPリクエストの Content-Type が multipart/form-data になります。
$ curl -X POST -F 'age=30' -F file1=@/var/tmp/sample.jpg https://xxxxx.net/xxxxxx
データBody全部をファイルとして送信する
変数名などを紐付けず、POSTするデータそのものをファイルとしたい場合は –data-binary オプションで、送信したいファイル名を値として指定します。 この場合 Content-Type ヘッダは application/x-www-form-urlencoded が自動的にセットされますが -H もしくは –header オプションで Content-Type ヘッダを上書きすることもできます。
$ curl -X POST -H 'Content-Type: image/jpeg' --data-binary @/var/tmp/sample.jpg https://xxxxx.net/xxxxxx
JSON形式
データをJSON形式でPOSTしたい場合は -H オプションで Content-Type: application/json を指定し、送信するデータがJSON形式であることを明示します。 送信するデータは –data でJSON文字列を指定します。
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"太郎", "age":"30"}' https://xxxxx.net/xxxxxx
なお、送信するJSON文字列が長いなどの理由から、ファイルから読み込んで送信したい場合は –data オプションに @ファイル名 を指定することで実現できます。 (次の例は request.json に送信したいJSONが保存されている例)
$ curl -X POST -H "Content-Type: application/json" -d '@request.json' https://xxxxx.net/xxxxxx
XML形式
データをXML形式でPOSTしたい場合は -H オプションで Content-Type: application/xml を指定し、送信するデータがXML形式であることを明示します。 送信するデータは –data でXML文字列を指定します。
$ curl -X POST -H "Content-Type: application/xml" -d '<person><name>太郎</name><age>30</age></person>' https://xxxxx.net/xxxxxx
なお、送信するXML文章が長いなどの理由から、ファイルから読み込んで送信したい場合は –data オプションに @ファイル名 を指定することで実現できます。 (次の例は request.xml に送信したいXML文章が保存されている例)
$ curl -X POST -H "Content-Type: application/xml" -d '@request.xml' https://xxxxx.net/xxxxxx
トラブルシュート
最後にcurlコマンドでPOSTしようとした際に発生する警告について解説します。
Note: Unnecessary use of -X or –request, POST is already inferred.
curlコマンド実行時に -v もしくは –verbose オプションをつけた際に、通信の詳細を表示することができますが、そこに Note: Unnecessary use of -X or –request, POST is already inferred. という警告メッセージが表示される場合があります。 実は -d や -F を指定した場合はデフォルトのHTTPリクエストメソッドがPOSTになります。 ですので -d や F オプションが含まれている場合は -X POST を指定する必要がないのです。 もしこの警告メッセージが気になる場合は -X POST オプションを消してあげればOKです。
終わりに
本稿ではcurlコマンドでデータをPOSTする際の、様々な形式ごとの送信方法についてまとめました。 皆様のお仕事のお役に立てれば幸いです。