如何从 Azure API 管理中的请求正文获取原始日期时间值?



目前,我正在尝试访问Azure API Management中JSON属性的原始值。 我的要求如下:

{
"date": "2019-12-09T12:00:00Z"
}

以及如下操作:

<inbound>
<base />
<!-- Assume datetime in format 2019-12-09T12:00:00Z -->
<set-variable name="time" value="@(context.Request.Body.As<JObject>()["date"])" /> 
<!-- Attempt to acquire raw value -->
<set-variable name="rawValue" value="@{
var value = JsonConvert.SerializeObject((JValue)context.Variables["date"]);
return value.ToString();
}" />
<!-- raw value is: "2019-12-09T12:00:00Z" -->
</inbound>

我在这里找到了类似的答案: JToken:获取原始/原始 JSON 值 所以我尝试序列化该对象。

但就我而言,Azure API 管理输出带有附加引号的原始值,如下所示:

set-variable (0 ms)
{
"message": "Context variable was successfully set.",
"name": "rawValue",
"value": ""2019-12-09T12:00:01Z""
}

一个简单的方法是更换它们,但没有更好的解决方案吗?

+++ 更新 +++

刚刚找到这个解决方案:

Convert.ToDateTime(context.Request.Body.As<JObject>()["date"]).ToString("o")

其中输出:

set-variable (0 ms)
{
"message": "Expression was successfully evaluated.",
"expression": "Convert.ToDateTime(context.Request.Body.As<JObject>()["date"]).ToString("o")",
"value": "2019-12-10T09:10:00.0000000Z"
}

IMO 这仍然不是我预期的 100%,但至少它是正确的格式。 我仍然愿意接受任何更好的解决方案。

随着此处宣布的即将发布的Azure API Management版本,应该可以指定自己的JsonSerializerSettings,并且可以像这样存储变量:

<set-variable name="body" value="@(context.Request.Body.AsJObject(preserveContent = true, new JsonSerializerSettings() { DateParseHandling = DateParseHandling.None } ))" /> 

我会在部署后立即发布更新,我可以设法对其进行测试。

更新

将新的context.Request.Body.AsJObject()方法与JsonSerializer设置结合使用,DateTime 值的输出现在将不再更改:

{
"source": "set-variable",
"timestamp": "2020-11-19T07:33:34.7901180Z",
"elapsed": "00:00:00.0018103",
"data": {
"message": "Context variable was successfully set.",
"name": "timestampFilter",
"value": "2019-12-09T12:00:00Z"
}
}

你在这里完全混淆了类型。context.Request.Body.As<JObject>()["date"]返回包含字符串值2019-12-09T12:00:00Z的 JToken 。当您调用JsonConvert.SerializeObject((JValue)context.Variables["date"])时,您要求 JSON.NET 将给定的令牌序列化为字符串。字符串在JSON中表示为带引号的一系列字符,所以当然value等于"2019-12-09T12:00:01Z",即里面有"的字符串。如果你只想要字符串值,请执行以下操作:

<set-variable name="rawValue" value="@(context.Request.Body.As<JObject>()["date"].ToString())" />

最新更新