Search code examples
aws-lambdatwilioaws-api-gateway

API Gateway error "Unsupported Media Type" when trying to accept application/x-www-form-urlencoded data


I am using the following tutorial: https://www.twilio.com/docs/sms/tutorials/how-to-receive-and-reply-python-amazon-lambda

When I test the api in aws I receive a 415 error, Unsupported Media Type. I assume this is related to the fact that Twilio sends its data in the form of application/x-www-form-urlencoded and AWS wants json.

The tutorial takes this into account. However, its code does not work for me.

I have searched the web, and tried numerous fixes to no avail.

The raw data from Twilio is (with sensitive information changed)

ToCountry=US&ToState=AK&SmsMessageSid=SM7777777777777777777777&NumMedia=0&ToCity=AAA&FromZip=99999&SmsSid=SM9999999999999999999&FromState=AK&SmsStatus=received&FromCity=BBB&Body=Is+this+json+&FromCountry=US&To=%2B15555555555&ToZip=88888&NumSegments=1&ReferralNumMedia=0&MessageSid=SM888888888888888888&AccountSid=AC6666666666666666&From=%2B14444444444&ApiVersion=2010-04-01

I enter this information in the body section of the test, run the test and the error is thrown. There is also the same error when I try the actual webhook through Twilio.

I have also entered with surrounded in {} I have also tried a jsonified version with the ampersands changed to commas, and the equal signs changed to colons with the items in quotes. I also have tried:

{
    "to_number": "+14444444444",
    "from_number": "+15555555555",
    "message": "hello does this API work"
}

I have also tried to add the following to the header of the test

"Content-Type": ["application/x-www-form-urlencoded"] 

Many of the fixes I have tried involve changing the Integration Request mapping. None have worked. The one from the tutorial is:

#set($httpPost = $input.path('$').split("&"))
{
#foreach( $kvPair in $httpPost )
 #set($kvTokenised = $kvPair.split("="))
 #if( $kvTokenised.size() > 1 )
   "$kvTokenised[0]" : "$kvTokenised[1]"#if( $foreach.hasNext ),#end
 #else
   "$kvTokenised[0]" : ""#if( $foreach.hasNext ),#end
 #end
#end
}

And is of content type application/x-www-form-urlencoded

There is a stack on this topic: Amazon Api gateway integration with Twilio None of its solutions worked for me.

I thought the following was very promising, but it also failed for me. https://gist.github.com/199911/68a43f83fd933b1e3ac6

I have also tried to change the lambda function. However I do not think it is the source. Its tests work.

Any help would be much appreciated.


Solution

  • Quote from AWS console:

    You can configure binary support for your API by specifying which media types should be treated as binary types. API Gateway will look at the Content-Type and Accept HTTP headers to decide how to handle the body.


    It sounds like you should configure your specific media type "application/x-www-form-urlencoded" under API gateway settings (Binary Media Types), which will tell the API gateway to accept that body type.

    Navigate to Api Gateway Console:

    1. Click on your API
    2. On the left select settings (under API menu)
    3. Scroll down and click Add Binary Media Type
    4. Type application/x-www-form-urlencoded Click save

    Hoping this will help.