swift - Steam 通过日期参数

标签 swift date vapor

在我的 Vapor 3 应用程序中,我有一个 Event 模型,它具有属性 startDate: DateendDate: 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/

相关文章:

swift - Vapor中描述依赖包的majorVersion和minor

postgresql - 如何存储带有小数字段的 Vapor Fluent 模型

ios - 加载 UITableView 后停止事件指示器

ios - TableView : how to get a string from selected row?

excel - 字典循环每个键的值

performance - 为什么这个 Java 代码有这个年龄验证日期比较?

swift - Vapor 3 Swift 4 如何制作计时器

ios - UITableView:刷新完成后强制 "release tableview"

ios - 字符串不符合协议(protocol) "intervalType"

java - 使用不同的标准解析 Json 日期