2015-07-20 144 views
4

亚马逊API网关我已经创建了一个包含一个单一的资源称为演示和一个POST与之对应方法的简单API:部署API亚马逊API网关

enter image description here

现在,我希望我的端点接受POST请求任意内容类型,所以不一定应用程序lication/json,而且明文/文本。然后我想利用请求的并在JSON对象包裹它,并将其发送到一个亚马逊lambda函数LAMBDA函数只能接受JSON对象作为参数)。

为此我已经编辑与我的方法的合并请求使用自定义模板映射:

enter image description here

我已经使用了来自亚马逊的文档可以在这里找到参考: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

lambda函数看起来是这样的:

exports.handler = function(event, context) { 
    context.succeed(event); 
}; 

测试时,我得到预期的输出,无论什么我送:

enter image description here

然而,当我部署,改造只是不工作了,预计JSON

  • 发送任何yelds这样的:

enter image description here

  • 发送JSON产生这样的:

enter image description here

是否有执行不对这个过程的任何部分?部署时我错过了什么吗?对我来说,它看起来像一个非常恼人的亚马逊错误,任何人都可以证实?

+0

“测试”按钮是否工作? – kixorz

+0

是的,但重要的是要明白,测试时,请求的内容类型被强制为* application/json *。这将反过来匹配我的模板。 – Interfector

+0

你不能删除所需的'Content-Type'或将其替换为''*''? – kixorz

回答

3

使用内容类型“application/json”。

https://gist.github.com/maruks/e036168263cd412146e6

+2

您的解决方案非常好,绝对比我在文档中找到的要好。但是,这意味着我需要事先知道可能会收到的所有内容类型。是否有办法指定类似于通配符内容类型的内容,即使没有设置内容类型(或不同的内容类型),也会捕获请求? – Interfector

+0

@Interfector我相信它还不可能有一个默认/通配符处理程序。亚马逊没有在他们的论坛上对[这个问题](https://forums.aws.amazon.com/message.jspa?messageID=665906#665906)给出正式答复。 – user3526

+0

application/json是默认的内容类型。 如果在请求中没有指定content-type,application/json的映射模板将用于为Lambda创建事件。 如果在请求中设置了内容类型,那么您似乎需要为每种可能的内容类型设置一个模板。 –

1

您是否尝试过在curl请求中设置Accept和Content-Type标头?下面我假设你发送“text/plain”并且可以接受json的回应

-H "Content-Type: text/plain" -H "Accept: application/json" 
+0

我刚刚尝试过,它不起作用。接受的部分是多余的,我只会接受任何抛向我的东西。我也尝试将Content-Type设置为应用程序/ json,希望我错过了来自Amazon的一些魔术。 – Interfector