3

我正在构建一个 API 网关,它有一个将 DateTime 值作为参数的端点。它使用 Refit 将此查询转发到底层微服务。

我的问题是,在构建微服务查询的 URL 时,DateTime 值失去了精度。

有没有办法在构建 URL 时将 Refit 配置为使用自定义 DateTime 序列化程序?

微服务端点定义如下:

[Get("/client-sales")]
Task<ClientSaleCollectionR12n> SearchClientSales([Header("Authorization")] string authorization,
                                                         DateTime? completedAfter = null,
                                                         DateTime? completedBefore = null);

发送到网关的查询:

GET /client-sales?completedAfter=2020-03-20T14:54:26.786&completedBefore=2020-03-21T15:16:33.212

转发到底层微服务时变成这样:

GET /client-sales?completedAfter=03%2F20%2F2020%2014%3A54%3A26&completedBefore=03%2F21%2F2020%2015%3A16%3A33
4

2 回答 2

1

我能够在定义接口时指定格式。

Task<ClientSaleCollectionR12n> SearchClientSales([Header("Authorization")] string authorization,
                                                         [Query(Format = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'")] DateTime? completedAfter = null,
                                                         [Query(Format = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'")] DateTime? completedBefore = null);
于 2020-03-23T13:14:54.837 回答
0

由于 refit 使用 Newtonsoft.Json,也许在 refit 使用的 JsonConverter 上设置 DateTimeZoneHandling 有效?

https://www.newtonsoft.com/json/help/html/SerializeDateTimeZoneHandling.htm

我遇到了这个问题,因为我们有同样的问题,但还没有机会尝试。但如果您不必在任何地方指定格式,这将是一种更通用(/更好)的方法。

于 2021-06-29T06:36:07.670 回答