learn-aws-lambda icon indicating copy to clipboard operation
learn-aws-lambda copied to clipboard

How to pass application/x-www-form-urlencoded data through API Gateway to Lambda

Open nelsonic opened this issue 9 years ago • 7 comments

I'm trying to allow an HTML Form to be submitted (without any JS XHR/Ajax) and it appears to be quite tedious in API Gateway ...

http://stackoverflow.com/questions/32057053/how-to-pass-a-params-from-post-to-aws-lambda-from-amazon-api-gateway which lead to: https://forums.aws.amazon.com/thread.jspa?messageID=673012

nelsonic avatar Apr 27 '16 11:04 nelsonic

I am also stuck in the same issue. Having a difficult time mapping data coming from an HTML form in "application/x-www-form-urlencoded" content-type to dynamodb.

SuperSarkar avatar May 24 '18 03:05 SuperSarkar

@SuperSarkar if you are "successful" it would be great if you can share the solution. 😉 (thanks!)

nelsonic avatar May 24 '18 08:05 nelsonic

Wasted two days. Can't make this happen without involving a lambda function in between. I am giving up. I will use a lambda function.

SuperSarkar avatar May 24 '18 14:05 SuperSarkar

@SuperSarkar fair enough ... 👍

nelsonic avatar May 24 '18 15:05 nelsonic

I finally got the template from StackOverflow working. Here's my integration request mapping template to insert new item into a DynamoDB table from a HTML form:

{
    "TableName": "table_name",
    "Item": {
    #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 = $util.urlDecode($keyVal[1]) )
                #else
                    #set( $val = '' )
                #end
            "$key": 
            {
                "S": "$val"
            }#if($foreach.hasNext),#end
        #end
    #end
    }
}

There is one major problem though, I am hard-coding the type of the value by using "S". It would be awesome if someone could point to a direction to make this more flexible.

SuperSarkar avatar May 25 '18 04:05 SuperSarkar

+1

jarrettj avatar Jul 17 '18 14:07 jarrettj

If you are using serverless, there's a middy middleware: https://www.npmjs.com/package/@middy/http-urlencode-body-parser

maheshsamudra avatar Sep 06 '22 08:09 maheshsamudra