jac*_*cus 6 velocity amazon-web-services aws-api-gateway
我有一个API网关,其POST方法直接放在DynamoDB表中.我的方法也配置为通过Lambda使用自定义授权程序.
在我的模板映射中,我正在使用一些授权变量,例如$context.authorizer.principalId或$context.authorizer.accountId.简化的模板映射如下所示:
{
"TableName": "$stageVariables.tableName",
"Item": {
"AccountId": {
"S": "$context.authorizer.accountId"
},
"Id": {
"S": "$context.requestId"
},
"Content": {
"S": "$input.path('$.content')"
},
"UserId": {
"S": "$context.authorizer.principalId"
}
}
Run Code Online (Sandbox Code Playgroud)
}
现在,当我向部署到实际阶段的此API方法发出HTTP请求时,该请求将通过自定义授权程序并提供/填写$context.authorizer.*模板中的所有变量,如下所示:
{
"TableName": "MyTable",
"Item": {
"AccountId": {
"S": "12345"
},
"Id": {
"S": "6fd5ff08-34c0-11e7-bf96-591a565835b3"
},
"Content": {
"S": "my content"
},
"UserId": {
"S": "userid-123456789"
}
}
Run Code Online (Sandbox Code Playgroud)
}
通过API网关测试按钮测试API方法时,测试请求绕过自定义授权程序(这是有道理的,因为授权程序可以单独测试)并生成如下结果:
{
"TableName": "MyTable",
"Item": {
"AccountId": {
"S": ""
},
"Id": {
"S": "test-invoke-request"
},
"Content": {
"S": "my content"
},
"UserId": {
"S": ""
}
}
Run Code Online (Sandbox Code Playgroud)
}
以下内容现在无效,因为所有字段都针对模型进行验证,并获得以下验证错误:
Endpoint response body before transformations: {"__type":"com.amazon.coral.validate#ValidationException","message":"One or more parameter values were invalid: An AttributeValue may not contain an empty string"}
Run Code Online (Sandbox Code Playgroud)
在测试API网关方法时,有没有办法指定授权者变量?或者是否有一些聪明的方法来定义模板映射中的回退变量,以便当它解析为空时,它会回退到,例如,test-invoke-principalid就像$context.requestId开箱即用?
我想要的是仍然能够使用API网关测试功能,同时保持所有验证/授权器设置.
当然,我们可以考虑为测试调用功能添加占位符。当然是针对principalId。至于自定义上下文变量,这可能会更困难,我们拭目以待。我们最终也希望有一个更好的端到端测试解决方案。
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |