curl で色んなリクエストをする方法・AWS Lambda や Netlify Functions での受け取り方まとめ
curl
でこんなリクエストを投げたい、という時の簡単なまとめ。かつ、そのリクエストを AWS Lambda や Netlify Functions で受け取る時のやり方をまとめる。
目次
URI エンコードした文字列をクエリ文字列として渡したい
俗にいうパーセント・エンコーディングした文字列をクエリ文字列に指定したい場合。
curl
単体ではクエリパラメータを URI エンコード出来ないので、別途 URI エンコードを行う必要がある。それ用のシェルスクリプトを書いても良いし、適当なコマンドを書いても良いが、自分がよく使う言語で手っ取り早いのは、Node.js (node
) で encodeURIComponent()
を叩いちゃう方法かと。
$ curl -X GET "http://example.com/?token=XXXXX&text=$(node -p "encodeURIComponent('テスト')")"
AWS Lambda や Netlify Functions でこのリクエストを受け取る時は、event.queryStringParameters
で受け取ることになる。デコード等は不要。
const params = event.queryStringParameters;
const token = params.token; // → 'XXXXX'
const text = params.text ; // → 'テスト'
POST ボディを URI エンコードする
Slack の Incoming Webhook 用のエントリポイントを作っていて、ローカルで検証したい時に。Slack 側がこんなリクエストを投げてくる、というのを再現できる。
curl
には --data-urlencode
というオプションがあるので、コレを利用すれば、リクエストボディの内容を URI エンコード出来る。
$ curl -X POST --data-urlencode 'token=XXXXX' --data-urlencode 'text=テスト' 'http://example.com/'
AWS Lambda や Netlify Functions でこのリクエストを受け取る時は、event.body
を URLSearchParams
なんかでパースすれば受け取れる。以下のような
const params = [...new URLSearchParams(event.body)].reduce((acc, pair) => ({...acc, [pair[0]]: pair[1]}), {});
const token = params.token; // → 'XXXXX'
const text = params.text ; // → 'テスト'
JSON をやり取りする
IFTTT 連携とか、よくある RESTful API とかを相手に application/json
なやり取りをする場合。
curl
の --data
(-d
) オプションに、JSON を表現する文字列をそのまま渡してやれば良い。スペースの有無などは関係ないだろう。
# 相手側の都合によるが、基本的には JSON 文字列内のスペース等は無関係なはず
$ curl -X POST --data '{"token":"XXXXX","text":"テスト"}' 'http://example.com/'
$ curl -X POST --data '{ "token": "XXXXX", "text": "テスト" }' 'http://example.com/'
AWS Lambda や Netlify Functions でこのリクエストを受け取る時は、event.body
を JSON パースすれば受け取れる。
const params = JSON.parse(event.body);
const token = params.token; // → 'XXXXX'
const text = params.text ; // → 'テスト'
以上。