POST URL for Amazon API

I create a webhook to receive notifications from a third-party service, they sent data to the POST body with the content type application/x-www-form-urlencoded .

But it generates the same error:

 {"message": "Could not parse request body into json: Unrecognized token \'name\': was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: [ B@456fe137 ; line: 1, column: 6]"} 

I could reproduce the error with the following curl call:

 % curl -v -X POST -d 'name=Ignacio&city=Tehuixtla' https://rl9b6lh8gk.execute-api.us-east-1.amazonaws.com/prod/mandrillListener * Trying 54.230.227.63... * Connected to rl9b6lh8gk.execute-api.us-east-1.amazonaws.com (54.230.227.63) port 443 (#0) * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * Server certificate: *.execute-api.us-east-1.amazonaws.com * Server certificate: Symantec Class 3 Secure Server CA - G4 * Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5 > POST /prod/mandrillListener HTTP/1.1 > Host: rl9b6lh8gk.execute-api.us-east-1.amazonaws.com > User-Agent: curl/7.43.0 > Accept: */* > Content-Length: 27 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 27 out of 27 bytes < HTTP/1.1 400 Bad Request < Content-Type: application/json < Content-Length: 180 < Connection: keep-alive < Date: Thu, 28 Jan 2016 12:29:40 GMT < x-amzn-RequestId: cd4d9232-c5ba-11e5-a158-b9b39f0b0599 < X-Cache: Error from cloudfront < Via: 1.1 1915b8b49d2fbff532431a79650103eb.cloudfront.net (CloudFront) < X-Amz-Cf-Id: cxU2_b5DzIw4M_n3hJBFXTu9AVRBL3GpbQqUId9IxgS004DfLYqYmg== < * Connection #0 to host rl9b6lh8gk.execute-api.us-east-1.amazonaws.com left intact {"message": "Could not parse request body into json: Unrecognized token \'name\': was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: [ B@d92973b ; line: 1, column: 6]"} 

If I wrap the body with double quotes, it works fine:

 % curl -v -X POST -d '"name=Ignacio&city=Tehuixtla"' https://rl9b6lh8gk.execute-api.us-east-1.amazonaws.com/prod/mandrillListener * Trying 54.230.227.19... * Connected to rl9b6lh8gk.execute-api.us-east-1.amazonaws.com (54.230.227.19) port 443 (#0) * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * Server certificate: *.execute-api.us-east-1.amazonaws.com * Server certificate: Symantec Class 3 Secure Server CA - G4 * Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5 > POST /prod/mandrillListener HTTP/1.1 > Host: rl9b6lh8gk.execute-api.us-east-1.amazonaws.com > User-Agent: curl/7.43.0 > Accept: */* > Content-Length: 29 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 29 out of 29 bytes < HTTP/1.1 200 OK < Content-Type: application/json < Content-Length: 6 < Connection: keep-alive < Date: Thu, 28 Jan 2016 12:33:20 GMT < x-amzn-RequestId: 50610606-c5bb-11e5-b140-5d837ffe26ed < X-Cache: Miss from cloudfront < Via: 1.1 a670cda0e28541e40881b95b60c672b7.cloudfront.net (CloudFront) < X-Amz-Cf-Id: mCLKL4eOnpUMd15IXQZw0RStJHw9Vdf3ivdCl37dcmno2JFOfxw0Vg== < * Connection #0 to host rl9b6lh8gk.execute-api.us-east-1.amazonaws.com left intact "true"% 

lamba has only one line:

 context.succeed('true'); 

How can I make the api gateway not treat the body like json?

I tried the template matching documentation without any success, even tried to convert it to a static template without any variables! In all cases, an error occurs before proceeding to my code.

+9
amazon-web-services aws-lambda aws-api-gateway
source share
4 answers

Try installing the display template as follows:

 { "body" : $input.json('$') } 

This will convert the string to json and switch to lambda.

From amazon docs : The $input.json(x) function evaluates a JSONPath expression and returns the results as a JSON string.

+11
source share

This is not completely connected, but if you are new to Amazon API Gateway, then I did not know that I had to perform one additional step - (re) deploy your API after adding a mapping template, as others suggested (in case you previously deployed) your API). It cost me a lot of time to debug, because I did not understand why I continued to get this error even after making suggestions posted here.

If you are using the AWS console,

  • go to any panel in your API
  • Select the Actions menu at the top.
  • Select Deploy API from the menu, select the appropriate step and confirm
+3
source share

The mapping template for working with form data is quite complex. Here is the gist: https://gist.github.com/ryanray/668022ad2432e38493df

In addition, you can see this message that I wrote that it has an example of integration with Slack (their interceptors send POST as form data to the Gateway API): http://www.ryanray.me/serverless-slack-integrations

+1
source share

In the Gateway API, select the POST method for your resource, select Integration Request, and create a new display template for application/x-www-form-urlencoded :

 #set($body = $input.path('$')) #set($jsonString = $util.urlencode($body)) #set($json = $util.parsejson($jsonString)) { "body" : $json, } 

Alternatively, you can simply pass the URL encoded string:

 #set($body = $input.path('$')) { "body" : "$body", } 

and URLs decode and parse JSON in your lambda.

0
source share

All Articles