【问题标题】:Default Content-Type for Mapping Template映射模板的默认 Content-Type
【发布时间】:2015-12-28 11:09:29
【问题描述】:

不幸的是,我正在与一个不符合任何标准的项目的数据提供者合作,因此在请求的标头中没有指定内容类型。实际上它是指定的,但与内容类型不同的键。

POST 请求的负载是 xml 格式,所以据我了解,我们需要使用映射模板将负载包装在 json 对象中。当我们将 content-type 指定为集成请求部分中的设置类型之一时,所有这些都非常有用。

现在据我了解,如果请求标头中未指定 content-type,那么它应该默认为“application/json”并执行与该类型关联的映射模板。在我们的例子中,它的行为就像它忽略了映射模板,这反过来导致返回以下错误:

{"Type":"User","message":"无法将请求正文解析为 json。"}

请注意,请求被发送到 AWS Lambda 进行处理。

有什么想法可以让它发挥作用吗?

编辑:我已确认默认值为“application/json”,以防标头中未设置 Content-Type。在这种情况下,我假设我遇到的是一个错误。

【问题讨论】:

  • 如果默认的内容类型是application/json,难道网关期待 JSON,并且拒绝请求,因为那不是有效载荷?
  • 是和不是。这与是否调用映射模板无关,它只是指定应该调用哪一个。至少应该调用映射模板。如果我将 Content-Type 显式设置为 application/json,则调用映射模板,并将 xml 内容很好地转换为 JSON 对象,一切都很好。问题是,当缺少该内容类型时,不会调用默认值,它应该是应用程序/json。 AWS 代表在他们的论坛上已经确认应该调用默认值。看起来这可能是 AWS 中的一个错误。
  • 默认Content-Type可以是'*'
  • 也试过了。没有幸福的结局!
  • 有什么新想法吗?

标签: amazon-web-services content-type aws-lambda aws-api-gateway


【解决方案1】:

如果您不太依赖映射模板,则始终可以使用 lambda 代理集成:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

这实际上将解析主体的责任转移回了您的 lambda 函数。您的 event 对象现在将包含一个 body 字符串,因此无论标题如何,api-gw 都会简单地将正文传递给您的函数来处理。这将允许您将正文解析为 XML,即使内容类型标头丢失/无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2023-03-23
    • 2015-10-27
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多