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.bodyURLSearchParams なんかでパースすれば受け取れる。以下のような

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 ;  // → 'テスト'

以上。