0 votes
1 view
in AWS by (18.1k points)

I'm creating a webhook to receive notifications from a 3rd-party service, they sent the data in the body of a POST with 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: [[email protected]; 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: [[email protected]; 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"%

The lambda has only one line: 

context.succeed('true');

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

I tried the documentation about template mapping with no success, I even tried to convert it to a static template, with no variables at all! In all cases, the error happens before getting to my code.

1 Answer

0 votes
by (42.2k points)
selected by
 
Best answer

Set the mapping template like this:

{

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

}

This template will convert your string into JSON and will pass it to lambda.

...