【问题标题】:How to get raw datetime value from request body in Azure API Management?如何从 Azure API 管理中的请求正文获取原始日期时间值?
【发布时间】:2019-12-09 09:36:22
【问题描述】:

目前我正在尝试访问 Azure API 管理中 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: Get raw/original JSON value 所以我尝试序列化对象。

但在我的例子中,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%,但至少它是正确的格式。 我仍然愿意接受任何更好的解决方案。

【问题讨论】:

  • 原始值是"2019-12-09T12:00:00Z",因为它是一个字符串,所以当你序列化它时它变成"\"2019-12-09T12:00:00Z\"",因为它包含引号。将其保留为日期,而不是对其进行序列化。
  • 谢谢,但我实际上需要确保输入格式与上述完全一致。因此,我正则表达式检查该值,这仅适用于字符串。使用 .ToString() 方法时,格式将被默认日期时间格式覆盖。 .ToString("o") 和 ToString("u") 的格式也不完全相同,所以我尝试了 JsonConvert 方法。

标签: c# azure azure-api-management


【解决方案1】:

随着即将发布的 here 宣布的 Azure API 管理版本,应该可以指定他自己的 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"
    }
}

【讨论】:

    【解决方案2】:

    您在这里完全混淆了类型。 context.Request.Body.As&lt;JObject&gt;()["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())" />
    

    【讨论】:

    • 谢谢,但我想这可能是我尝试的第一件事。正如我所说,每当调用 .ToString() 时,都会输出不同的格式: set-variable (0 ms) { "message": "Context variable was successfully set.", "name": "rawValue", "value": “2019 年 12 月 10 日上午 9:10:00”}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2020-07-08
    • 2019-10-29
    • 2021-10-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多