在我的 Vapor 3 应用程序中,我有一个 Event
模型,它具有属性 startDate: Date
和 endDate: Date
。
现在,我想知道如何在 POST 请求中传递这些日期值。在 Postman 中,我在 x-www-form-urlencoded
中尝试了以下操作:
startDate -> 2019-03-14
这将返回以下错误:
Could not convert to
Double
: str(\"2019-03-14\")
显然,Date
变成了 Double
。
那么,相反,我需要传递什么值?
注意事项
我知道,在 Postman 中,我可以插入 {{$timestamp}}
,但是 1) 在 Postman 外部使用 API 时这不能回答我的问题,2) 这不能不允许我输入除现在以外的日期。
最佳答案
所以这里的问题是,默认情况下,Date
实例使用自 2001 年 1 月 1 日以来的时间间隔进行解码。URL form decoder Vapor 使用的那个不支持像 JSONDecoder
目前那样的不同日期策略,所以你必须以不同的方式进行解码。以下是我能想到的几个想法:
- 只需在请求中发送时间戳。为了在 Postman 中测试不同的日期,您可以在预请求脚本中设置环境变量并在请求正文中访问它。
手动实现
Event.init(from:)
和.encode(to:)
方法。只是为了确保您不会破坏 Fluent 编码,您可能需要添加一些额外的逻辑,但它应该可以工作。这是一个例子:final class Event: Model { static let formDateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.calendar = Calendar(identifier: .iso8601) formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.dateFormat = "yyyy-MM-dd" return formatter }() var startDate: Date var endDate: Date init(from decoder: Decoder)throws { let container = try decoder.container(keyedby: CodingKeys.self) if let start = try? container.decode(String.self, keyedBy: .startDate), let date = Event.formDateFormatter.string(from: start) { self.startDate = date } else { self.startDate = try container.decode(Date.self, keyedBy: .startDate) } if let end = try? container.decode(String.self, keyedBy: .endDate), let date = Event.formDateFormatter.string(from: end) { self.endDate = date } else { self.endDate = try container.decode(Date.self, keyedBy: .endDate) } } }
关于swift - Steam 通过日期参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55172907/