Sending all HTTP parameters in API Gateway

Here’s an API Gateway mapping template to send all HTTP path, query string, and header parameters to your backend integration (i.e. Lambda function).

#set($allParams = $input.params())
{
    "body-json" : "$input.json('$')",
    "params" : {
    #foreach($type in $allParams.keySet())
        #set($params = $allParams.get($type))
        "$type" : {
            #foreach($paramName in $params.keySet())
                "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
                #if($foreach.hasNext),#end
            #end
        }
        #if($foreach.hasNext),#end
    #end
    }
}

will produce something like:

{
   "body-json":"{}",
   "params":{
      "path":{
         "pathParamName1":"pathParamValue1",
         "pathParamName2":"pathParamValue2",
         "pathParamName3":"pathParamValue3"
      },
      "querystring":{
         "queryParamName1":"queryParamValue1",
         "queryParamName2":"queryParamValue2",
         "queryParamName3":"queryParamValue3"
      },
      "header":{
         "headerParamName1":"headerParamValue1",
         "headerParamName2":"headerParamValue2",
         "headerParamName3":"headerParamValue3"
      }
   }
}

The parameters can then be accessed in your Lambda function, i.e.

exports.myHandler = function(event, context) {
   console.log("pathParamName1 = " + event.params.path.pathParamName1);
   context.succeed("");
}

Here’s a Gist with the example.

Cheers,
Ryan