AWS SAM中如何为API路径配置多个路径参数
问题原因
你配置校验失败的核心原因是API Gateway(SAM的Api事件底层依赖的AWS服务)不支持在同一路径段内连续定义两个无分隔符的路径参数,你预期写的/updateUserProfile/{companyName}{cognitoUserID}里两个参数挤在同一个路径段、没有明确边界,路径解析器无法区分两个参数的取值范围,自然无法通过语法校验。
可行实现方案
方案1:按REST规范用斜杠分隔多路径参数(推荐)
这是最稳妥、完全符合SAM和API Gateway规则的写法,直接把两个参数拆成独立的路径段,用斜杠分隔即可,配置示例:
Type: AWS::Serverless::Function Properties: CodeUri: cloudPortalFunctions/ Handler: app.updateUserProfile Layers: - !Ref updateUserProfileDepLayer Runtime: nodejs14.x Architectures: - x86_64 Events: updateUserProfile: Type: Api Properties: Path: /updateUserProfile/{companyName}/{cognitoUserID} Method: PUT
配置完成后,你在Lambda代码里可以直接从事件对象的路径参数中拿到两个值,Node.js 示例取值逻辑:
// Lambda代理集成模式下的取值方式 const { companyName, cognitoUserID } = event.pathParameters; // 拿到两个值后直接作为DynamoDB的分区键、排序键传入更新逻辑即可
最终请求路径格式为:/updateUserProfile/你的公司名/你的Cognito用户ID,完全满足你同时传两个键值的需求。
方案2:单路径参数+代码拆分(适用于必须把两个值放在同一路径段的场景)
如果你业务上强制要求两个参数出现在同一个路径段,不要定义两个路径参数,只需要定义单个路径参数承载拼接后的值,在Lambda代码里按约定分隔符拆分即可:
- YAML路径配置:
Path: /updateUserProfile/{userCompositeKey} Method: PUT - 约定拼接规则:比如用不会出现在CompanyName、CognitoUserID取值里的特殊字符(比如
_$_)作为分隔符,前端请求时把两个值拼成公司名_$_用户ID传入 - Lambda代码里拆分取值:
const compositeKey = event.pathParameters.userCompositeKey; const [companyName, cognitoUserID] = compositeKey.split('_$_');
注意:这个方案有取值解析失败的风险,必须确保你选的分隔符不会出现在两个参数的合法取值中,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Jino Rigney
相关产品推荐
相关产品推荐

