You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS API Gateway为何允许无效日期通过请求校验?

AWS API Gateway为何不对无效的date格式触发校验错误?

问题场景

我在AWS API Gateway中定义了如下请求模型:

{
  "required" : [ "validUntil" ],
  "type" : "object",
  "properties" : {
    "validUntil" : {
      "$ref":"https://apigateway.amazonaws.com/restapis/xxxyyyzzz/models/Timestamp"
    },
    "deadline" : {
      "$ref":"https://apigateway.amazonaws.com/restapis/xxxyyyzzz/models/Date"
    }
  }
}

其中Date和Timestamp模型定义如下:
Date模型:

{
  "type" : "string",
  "description" : "Date in ISO 8601 format.",
  "format" : "date"
}

Timestamp模型:

{
  "type" : "string",
  "description" : "Timestamp as defined by ISO 8601 with time offset.",
  "format" : "date-time"
}

测试时发现:

  • 传入无效时间戳(如2023-12-32T00:00:00+00:00),API Gateway会触发预期的校验错误:

Gateway response body: {"errorCode":"BAD_REQUEST_BODY","message":"Invalid request body","description":"[format attribute "date" not supported, string "2023-12-32T00:00:00+00:00" is invalid against requested date format(s) [yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss.SSSZ]]"}

  • 但传入无效日期(如2023-12-32)作为deadline字段值时,却提示校验通过:

Request validation succeeded for content type application/json

原因分析

AWS API Gateway对模型中format字段的校验逻辑存在差异:

  • format: date-time:会同时校验字符串的格式结构(是否符合ISO 8601时间戳格式)和实际日期有效性(比如月份、日期、时区的合法性),所以无效时间戳会被拦截。
  • format: date:仅做格式结构校验,即验证字符串是否符合yyyy-MM-dd的字符串形式,不会检查日期的实际逻辑有效性(比如12月32日、2月30日这类不存在的日期)。

解决方法

1. 用正则表达式增强Date模型校验

修改Date模型,添加pattern字段来匹配合法的日期范围,示例正则可覆盖1900-2099年的合法日期:

{
  "type" : "string",
  "description" : "Date in ISO 8601 format.",
  "format" : "date",
  "pattern" : "^(?:(?:19|20)\\d\\d)-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)$"
}

2. 后端集成中手动校验

如果需要更严谨的日期校验(比如处理闰年2月29日的场景),可以在Lambda等后端服务中,接收请求后手动解析日期字符串,验证其实际有效性,若无效则返回自定义错误响应。

内容的提问来源于stack exchange,提问作者Arek Jaworski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:22:25