我使用带有API Gateway extensions的Swagger 2.0定义创建了一个API网关。
我覆盖了默认的API网关响应,例如:
x-amazon-apigateway-gateway-responses:
BAD_REQUEST_BODY:
statusCode: 400
responseTemplates:
application/json: |
{
"error": {
"code": 400,
"stage": "$context.stage",
"request": "$context.requestId",
"message": "$context.error.message"
}
}
上述有效负载中的$context
来自API Gateway variables。
我的API中的示例资源/方法如下所示(始终LAMBDA_PROXY
集成):
paths:
/test:
post:
parameters:
- in: body
name: Test
required: true
schema:
$ref: "#/definitions/Test"
responses:
201:
description: Created
400:
description: Bad Request
401:
description: Unauthorized
403:
description: Forbidden
x-amazon-apigateway-integration:
uri: >-
arn:aws:apigateway:${region}:lambda:path/2015-03-31/functions/${lambda}/invocations
type: aws_proxy
httpMethod: POST
credentials: "${credentials}"
passthroughBehavior: never
使用相应的请求有效负载定义:
definitions:
Test:
type: object
title: Test
required:
- date
properties:
date:
type: string
pattern: "^20[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$"
description: Date in YYYY-MM-DD Format
x-amazon-apigateway-request-validator: body
x-amazon-apigateway-request-validators:
body:
validateRequestBody: true
validateRequestParameters: false
当我使用缺失或无效的date
调用此端点时,我总是得到相同的响应:
{
"error": {
"code": 400,
"stage": "latest",
"request": "6b7a64f5-e7f0-11e7-845b-f53ceb4cb049",
"message": "Invalid request body"
}
}
但是,当我通过没有date
属性的API网关控制台进行测试时:
Request body does not match model schema for content type application/json: [
object has missing required properties (["date"])
]
无效date
:
Request body does not match model schema for content type application/json: [
ECMA 262 regex "^20[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$" does not match input string "2017/12/25"
]
如何访问详细的错误消息,以便我可以使用比Invalid request body
更具描述性的消息来丰富我的错误响应?我怀疑这一定是可能的,也许是使用x-amazon-apigateway-gateway-responses
映射,但到目前为止我还没有能够做到。
答案 0 :(得分:12)
(API网关上的开发人员)
不幸的是,现在不支持此功能。我们正积极致力于解决此问题,但我无法在何时支持此问题时为您提供任何具体的时间表。
答案 1 :(得分:2)
由于API网关开发人员回答了这个问题,我仍然想为您添加一些提示,也许这有用,这可能是一个可以接受的答案!
对于您的问题,实际上您需要为api网关激活cloudwatch日志,这样您就可以获得比以前更多的日志。
如果其中包含Request Validator
此aws document - How do I enable Amazon CloudWatch Logs for APIs I created in the Amazon API Gateway?提供了有关如何启用它的步骤。
但我更喜欢使用此文档API Gateway and Lambda Logs,它可以让截图轻松跟进。
多次访问API网关,浏览名为:
的日志组API-Gateway-Execution-Logs_{rest-api-id}/{stage_name}
其中包含的详细信息多于Invalid request body
和其他信息,例如{"message": "Internal server error"}
。这是非常有用的功能,为我节省了很多时间来解决无服务器和api网关问题。
答案 2 :(得分:2)
这不是您的问题的答案,而是我们在我们的应用程序中使用的替代解决方法,它们用于相同的目的(请求验证)。
我们的无服务器API是通过在API Gateway中定义所有端点(包括Swagger文档)开始的。随着时间的推移,我们添加了更多端点(大约60多个端点由传统REST端点,公共REST端点和私有graphQL端点组成)。
通过API网关管理这些端点数量非常繁琐,部署时间很长(我们正在使用serverless
)。
最终,我们决定将其减少为三个" monolith"无服务器应用程序两个REST端点和一个GraphQL端点。
基本上,我们处理了Lambda处理程序中的路由(并且GraphQL不需要路由)。
对于请求验证,它是免费的GraphQL(喜欢GraphQL的另一个原因)。至于我们的REST处理程序,我们使用JSON模式和任何验证错误,我们可以轻松地返回到客户端以及HTTP 400错误消息。
答案 3 :(得分:2)
在这种情况下,请在“网关响应”部分中转到:
Bad Request Body [400]
Change the value of the body mapping template to:
{"message":$context.error.validationErrorString}
Ex输出:
{
"message": "[instance value (\"us\") not found in enum (possible values: [\"usd\",\"eur\",\"gbp\",\"jpy\",\"aud\",\"chf\",\"cad\",\"nzd\"])]"
}