如何验证XML请求体时间戳格式,APIM无法使用DateTime.TryParseExact怎么办
APIM 时间戳格式验证可行方案
提供两种可直接在APIM策略中落地的实现方式:
方案1:正则表达式校验
APIM策略表达式原生支持Regex.IsMatch()方法,可直接编写匹配目标格式的正则完成校验,执行效率最高。
匹配yyyy-MM-ddTHH:mm:ss.fzzz格式的正则如下:^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{1}[+-]\d{2}:\d{2}$
你可以直接在入站策略中添加校验逻辑,示例如下:
<inbound> <choose> <when condition="!Regex.IsMatch((string)context.Request.Body.As<XElement>().Descendants("你的时间戳字段名").FirstOrDefault(), @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{1}[+-]\d{2}:\d{2}$")"> <return-response> <set-status code="400" reason="Bad Request" /> <set-body>时间戳格式不符合要求,需为yyyy-MM-ddTHH:mm:ss.fzzz格式</set-body> </return-response> </when> </choose> <!-- 其余原有策略 --> </inbound>
方案2:解析后反向对比校验
如果需要覆盖更多边缘合法场景,避免正则漏判/误判,可以用解析后反向对比的逻辑:
- 先用
DateTime.TryParse()方法尝试解析输入的时间戳字符串 - 解析成功后,将得到的DateTime对象按目标格式
yyyy-MM-ddTHH:mm:ss.fzzz重新格式化 - 对比格式化后的字符串和原始输入字符串是否完全一致,一致则符合格式要求
对应策略表达式示例:
<inbound> <set-variable name="inputTimestamp" value="@((string)context.Request.Body.As<XElement>().Descendants("你的时间戳字段名").FirstOrDefault())" /> <choose> <when condition="@{ DateTime dt; if(!DateTime.TryParse((string)context.Variables["inputTimestamp"], out dt)) return true; return dt.ToString("yyyy-MM-ddTHH:mm:ss.fzzz") != (string)context.Variables["inputTimestamp"]; }"> <return-response> <set-status code="400" reason="Bad Request" /> <set-body>时间戳格式不符合要求,需为yyyy-MM-ddTHH:mm:ss.fzzz格式</set-body> </return-response> </when> </choose> <!-- 其余原有策略 --> </inbound>
内容的提问来源于stack exchange,提问作者Harmandeep Singh Kalsi
相关产品推荐
相关产品推荐

