APIGatewayでマッピングテンプレートを使いたい

こんな感じでサーバレスなアプリケーションを作成したい時ありませんか?
そして、運が悪いことに①から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」で送ってほしいナ💦

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です