当使用AWS API网关和AWS Lambda时,如何使用映射模板映射不在路径端的路径参数?

当使用AWS API网关和AWS Lambda时,如何使用映射模板映射不在路径端的路径参数?,lambda,aws-lambda,aws-api-gateway,Lambda,Aws Lambda,Aws Api Gateway,假设API网关中定义了这样的路由: POST/projects/{projectid}/key 它被映射到AWS Lambda 如何在Lambda处理程序中获得{projectid}值(即作为自定义Java类的输入对象的字段) 据我所知,像这样的东西应该可以完成这项工作: 在API网关定义Integration Request>Mapping template中,我为内容类型“application/json”添加了以下内容: 但是,即使冒号($input.params('projectd)后面

假设API网关中定义了这样的路由:

POST/projects/{projectid}/key

它被映射到AWS Lambda

如何在Lambda处理程序中获得
{projectid}
值(即作为自定义Java类的输入对象的字段)

据我所知,像这样的东西应该可以完成这项工作: 在API网关定义Integration Request>Mapping template中,我为内容类型“application/json”添加了以下内容:

但是,即使冒号(
$input.params('projectd)
后面的部分似乎被正确拾取(在CloudWatch的API网关日志中,该值看起来与预期的一样),映射也不起作用:
null
值到达后端

请注意,类似的方法适用于以下路线:

GET/projects/{id}
使用类似的映射可以正常工作

看起来路径参数只有在它是路径中的最后一个时才会被映射

  • 检查Java Lambda处理程序以确保反序列化处理正确。您可以从一个简单的NodeJS函数开始测试,该函数不需要RequestHandler实现(它将反序列化JSON负载中的所有内容,而不需要任何处理程序配置)

  • 不确定您在这里谈论的是同一个API,但不应允许在同一段上有两个路径参数,即/projects/{id}和/projects/{projectd}不应在同一个API中共存

  • 您可以从使用$input.params()获取所有参数开始,并确认“projectid”在该映射中通过。同样,在NodeJS函数中调试会更容易

  • 我发现了问题所在。 不是映射模板本身, 但是我调用AWS SDK函数的方式。 具体而言:

    apigClient.projectsProjectidKeyPost(params, {}, {})
    
    不起作用-Lambda代码中的Projectd arives
    null

    但是,这是可行的(请注意第二个参数值的变化):


    但不确定这种行为的根本原因是什么。

    可能只是您的输入错误,但映射模板规则应该是
    {“projectid”:“$input.params('project-id')”}
    。这应该会拉取与
    项目id相关的值,而不管它在路径中的什么位置。对不起,这确实是一个输入错误,但只在问题中,而不是在代码/配置中-它到处都是投影的。嗯,我不确定问题出在哪里。我经常使用资源路径中的变量,然后使用templ将它们拉出来ates。它们在路径中的位置似乎并不重要。有时我甚至在一个路径中有多个变量。我始终能够通过
    $input.params()
    机制访问它们。好的,谢谢!我会在发现问题后立即更新此线程(我希望很快收到亚马逊支持部门的答复).Hmm这是一个有趣的观察结果。我将向待办事项列表中添加一些内容来调查此行为。编辑:可能是您配置的映射模板在第一种情况下没有应用于请求。映射模板是根据内容类型标头选择的,因此在第一种情况下,客户端可能没有发送由于未发送任何内容,因此显示内容类型标题。
    apigClient.projectsProjectidKeyPost(params, {}, {})
    
    apigClient.projectsProjectidKeyPost(params, '{}', {})