Ant*_*chd 1 amazon-web-services aws-api-gateway openapi aws-step-functions
我正在开发一个具有以下工作流程的项目:API 网关(使用开放 api 定义)触发来自 AWS 的 Step 函数。有 2 个步骤,如果出现错误,状态机定义中有一个 catch 块。
但我面临错误处理的问题。即使我的代码抛出错误(例如 400),我的 Postman(或其他 REST API 测试工具)也会响应 200。我想要 500/400...
这是代码:
Step 函数定义为无服务器
stepFunctions:
stateMachines:
PostPayment:
name: testfunction
type: EXPRESS
definition:
Comment: 'test'
StartAt: Function1
States:
Function1:
Type: Task
Resource: !GetAtt Function1.Arn
Catch:
- ErrorEquals: ['HandledError']
Next: Fallback
Next: Function2
Function2:
Type: Task
Resource: !GetAtt Function2.Arn
Catch:
- ErrorEquals: ['HandledError']
Next: Fallback
End: true
Fallback:
Type: Fail
Cause: "Error occured",
Error: "Error"
Run Code Online (Sandbox Code Playgroud)
这是我的 openapi yml
x-amazon-apigateway-request-validator: all
x-amazon-apigateway-integration:
requestParameters:
integration.request.path.id: method.request.path.id
requestTemplates:
application/json:
Fn::Sub: |-
{
"input": "{\"id\": \"$input.params().path.get('id')\"}",
"stateMachineArn": "<ARN>"
}
httpMethod: POST
type: aws
credentials: !GetAtt ApiGatewayExecutionRole.Arn
uri: !GetAtt StartSyncExecution.Arn
responses:
"200":
statusCode: 200
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).output).body
"401":
statusCode: 401
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage
"400":
statusCode: 400
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage
"404":
statusCode: 404
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage
"500":
statusCode: 500
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage
Run Code Online (Sandbox Code Playgroud)
使用此配置,我总是传递 200 statusCode 情况。但由于我的代码抛出错误,因此我的主体响应出现错误。
我错过了什么?
快速扫描您的代码后,我认为您错过了两件事。
首先,在step函数中,您的错误状态是“Fail”类型,这意味着step函数停止并且没有任何内容返回到API网关,因此它所能做的就是报告200(或在open中设置的默认状态代码) API 定义)。
要将非标准状态代码返回给客户端,您必须从步骤函数返回一些内容,然后使用 API 网关中的数据转换来覆盖状态函数。
因此,您的后备状态应该是“Pass”类型并输出错误信息,包括状态代码。
然后,您在网关中检测该状态代码,并使用它来使用速度模板覆盖响应状态代码。
| 归档时间: |
|
| 查看次数: |
1763 次 |
| 最近记录: |