将HTTP Post从AWS API GW传递到Lambda

时间:2015-10-28 02:37:48

标签: mailgun aws-lambda aws-api-gateway

我从不支持JSON(Mailgun)的服务处理HTTP POST。如果我为POST创建AWS API GW并将其传递给AWS Lambda函数,则数据必须是JSON。除了尝试将POST序列化为JSON(我不愿意)之外,是否有人知道是否是这种情况?

1 个答案:

答案 0 :(得分:2)

我在这里找到了解决方案,对我有用。

https://forums.aws.amazon.com/thread.jspa?messageID=673012&tstart=0#673012

以下内容来自原帖,以获得完整答案。

  

分步说明如下:

     
      
  1. 亚马逊API网关 - >点击"创建API"。
  2.   
  3. API名称=" myTestAPI",从API克隆=不要从现有API克隆,说明="测试"
  4.   
  5. 点击"创建API"。
  6.   
  7. 点击"创建资源"。
  8.   
  9. 资源名称=" myTestInput",资源路径=" mytestinput"。
  10.   
  11. 点击"创建资源"。
  12.   
  13. 点击"创建方法"。
  14.   
  15. 选择" POST"或" GET"根据需要点击勾选。
  16.   
  17. 集成类型=" Lambda函数",根据需要选择区域,根据操作/存储表单数据编写代码。
  18.   
  19. 点击"保存",点击"确定"授予许可。
  20.   
  21. 点击"整合请求"。
  22.   
  23. 点击"映射模板"。
  24.   
  25. 点击"添加地图模板"。
  26.   
  27. 内容类型是" application / x-www-form-urlencoded"然后点击勾选。
  28.   
  29. 点击" application / x-www-form-urlencoded"。
  30.   
  31. 点击"输入直通"。
  32. 旁边的铅笔图标   
  33. 选择"制图模板"。
  34.   
  35. 将以下内容粘贴到“模板”框中:
  36.   

-

## convert HTML POST data or HTTP GET query string to JSON

## get the raw post data from the AWS built-in variable and give it a nicer name
#if ($context.httpMethod == "POST")
 #set($rawAPIData = $input.path('$'))
#elseif ($context.httpMethod == "GET")
 #set($rawAPIData = $input.params().querystring)
 #set($rawAPIData = $rawAPIData.toString())
 #set($rawAPIDataLength = $rawAPIData.length() - 1)
 #set($rawAPIData = $rawAPIData.substring(1, $rawAPIDataLength))
 #set($rawAPIData = $rawAPIData.replace(", ", "&"))
#else
 #set($rawAPIData = "")
#end

## first we get the number of "&" in the string, this tells us if there is more than one key value pair
#set($countAmpersands = $rawAPIData.length() - $rawAPIData.replace("&", "").length())

## if there are no "&" at all then we have only one key value pair.
## we append an ampersand to the string so that we can tokenise it the same way as multiple kv pairs.
## the "empty" kv pair to the right of the ampersand will be ignored anyway.
#if ($countAmpersands == 0)
 #set($rawPostData = $rawAPIData + "&")
#end

## now we tokenise using the ampersand(s)
#set($tokenisedAmpersand = $rawAPIData.split("&"))

## we set up a variable to hold the valid key value pairs
#set($tokenisedEquals = [])

## now we set up a loop to find the valid key value pairs, which must contain only one "="
#foreach( $kvPair in $tokenisedAmpersand )
 #set($countEquals = $kvPair.length() - $kvPair.replace("=", "").length())
 #if ($countEquals == 1)
  #set($kvTokenised = $kvPair.split("="))
  #if ($kvTokenised[0].length() > 0)
   ## we found a valid key value pair. add it to the list.
   #set($devNull = $tokenisedEquals.add($kvPair))
  #end
 #end
#end

## next we set up our loop inside the output structure "{" and "}"
{
#foreach( $kvPair in $tokenisedEquals )
  ## finally we output the JSON for this pair and append a comma if this isn't the last pair
  #set($kvTokenised = $kvPair.split("="))
 "$util.urlDecode($kvTokenised[0])" : #if($kvTokenised[1].length() > 0)"$util.urlDecode($kvTokenised[1])"#{else}""#end#if( $foreach.hasNext ),#end
#end
}
     
      
  1. 点击"制图模板"旁边的勾号下拉列表。
  2.   
  3. 点击"< - 方法执行"。
  4.   
  5. 点击"部署API"。
  6.   
  7. 部署阶段="新阶段",阶段名称="生产"。
  8.   
  9. 点击"部署"。
  10.