こんな感じでサーバレスなアプリケーションを作成したい時ありませんか?
そして、運が悪いことに①からPOSTされるContent-Typeが「
application/x-www-form-urlencoded 」だった~なんてことありますよね….
( application/jsonになっていれば、うまいことLambdaのハンドラに渡してくれるっぽい )
そんな時は、APIGatewayでマッピングテンプレートを使ってうまいことLambdaに渡してあげましょう!
①対象リソースのメソッドを選択後、
メソッドリクエスト → 統合リクエスト → Lambda
メソッドレスポンス ← 統合レスポンス ← Lambda
と表示されている「統合リクエスト」のリンクをクリックする。
②画面下部に「マッピングテンプレート」が表示されるので、「マッピングテンプレートの追加」を選択し、「application/x-www-form-urlencoded」を入力する。
③追加したContent-Typeをクリックすると謎の自由入力欄が表示されるので、下記の内容を入力する
{
#foreach( $token in $input.path('$').split('&') )
#set( $keyVal = $token.split('=') )
#set( $keyValSize = $keyVal.size() )
#if( $keyValSize >= 1 )
#set( $key = $util.urlDecode($keyVal[0]) )
#if( $keyValSize >= 2 )
#set( $val = $keyVal[1] )
#else
#set( $val = '' )
#end
"$key": "$val"#if($foreach.hasNext),#end
#end
#end
}
※ここでは、keyのみをurlデコードしてvalueは日本語や改行が含まれている場合、うまく処理できないのでLambdaに渡してからそこでデコードする形にしました。
pythonであれば、下記のようにすればうまく動くはずです。
import json
import requests
import urllib.parse
def lambda_handler(event, context):
parse_test = urllib.parse.unquote(event['test'])
return {
'statusCode': 200,
'body': json.dumps(parse_test)
}
こんな感じで動くのでは?ないでしょうか….
まとめ
Content-Typeは、「application/json」で送ってほしいナ💦