curl で外部 json ファイルを元に POST リクエストする方法
--data
, -d
オプションで @/file/to/path
という感じで指定すれば良い。
実行例
ENDPOINT=https://www.example.com
# ミニマムなリクエスト
# -d, --data オプションを使用する場合、自動で POST リクエストになるので -X POST は不要
curl --data @./request.json $ENDPOINT
# Content-Type として application/json を指定
# 明示的に Content-Type を指定しない場合、 Content-Type は application/x-www-form-urlencoded になる
curl --data @./request.json -H "Content-Type: application/json" $ENDPOINT
# 標準出力の json を受け取ってリクエスト
echo '{ "hoge": "fuga"}' | curl --data @- $ENDPOINT
動作検証には http://httpdump.io/ が便利
request.json サンプル
JSON 形式であれば何でも良いが、以下の URL にサンプルがあるので試してみると良いかも
JSON Example
https://json.org/example.html
curl の manual を読む
curl - How To Use
https://curl.se/docs/manpage.html
-d, –data
(HTTP MQTT) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded. Compare to -F, –form.
–data-raw is almost the same but does not have a special interpretation of the @ character. To post data purely binary, you should instead use the –data-binary option. To URL-encode the value of a form field you may use –data-urlencode. If any of these options is used more than once on the same command line, the data pieces specified will be merged together with a separating &-symbol. Thus, using ‘-d name=daniel -d skill=lousy’ would generate a post chunk that looks like ‘name=daniel&skill=lousy’.
If you start the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to read the data from stdin. Posting data from a file named ‘foobar’ would thus be done with -d, –data @foobar. When -d, –data is told to read from a file like that, carriage returns and newlines will be stripped out. If you don’t want the @ character to have a special interpretation use –data-raw instead.
See also –data-binary, –data-urlencode and –data-raw. This option overrides -F, –form and -I, –head and -T, –upload-file.
-d
,--data
オプションは POST リクエストで指定されたデータを HTTP サーバーに送信するcontent-type
としてapplication/x-www-form-urlencoded
を使用する
--data-raw
は殆ど同じだが、@
文字の特別な解釈が無い- データを純粋にバイナリで送信する場合には
--data-binary
オプションを使用する必要がある - フォームフィールドの値を URL エンコードするには
--data-urlencode
を使用できる
- データを純粋にバイナリで送信する場合には
- これらのオプションのいずれかが同じコマンドラインで複数回使用される場合、指定されたデータ部分は区切り文字と一緒にマージされる
-d name=daniel -d skill=lousy
と指定をするとname=daniel&skill=lousy
という post chunk が生成される
- データを
@
で始める場合、残りはデータを読み取るためのファイル名である必要がある- curl で stdin からデータを読み取る場合は
-
- foobar というファイルからのデータ投稿をする場合
-d, --data @foobar
のように指定する -d
,--data
がファイル読み取りを指示されると、キャリッジリターンと改行が削除される- 純粋に
@
を文字として使用したい場合、--data-raw
を使用する
- curl で stdin からデータを読み取る場合は
--data-binary
,--data-urlencode
,--data-raw
も参照すると良い- これらのオプションは
-F
,--form
,-I
,--head
,-T
,--upload-file
を上書きする
- これらのオプションは
この記事を試した環境
% uname -v
Darwin Kernel Version 19.6.0: Tue Nov 10 00:10:30 PST 2020; root:xnu-6153.141.10~1/RELEASE_X86_64
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H114
% curl --version
curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2
Release-Date: 2019-03-27
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets