curlコマンドでPOSTする, 様々な形式別メモ

投稿者 : OSCA

[PR] 関東地方の美しい夜景を観にいこう。 夜景サイト「夜景散歩」で夜景スポットを検索

コマンドラインから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-Typemultipart/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になります。 ですので -dF オプションが含まれている場合は -X POST を指定する必要がないのです。 もしこの警告メッセージが気になる場合は -X POST オプションを消してあげればOKです。

終わりに

本稿ではcurlコマンドでデータをPOSTする際の、様々な形式ごとの送信方法についてまとめました。 皆様のお仕事のお役に立てれば幸いです。

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca