Я не уверен насчет x-www-form-urlencoded
, потому что я проверил это, и если я отправляю дату как 0
, она декодирует ее как 2001-01-01 00:00:00 +0000
, думал, что это определенно должно быть 1970-01-01 00:00:00 +0000
.
Но с полезной нагрузкой JSON у вас есть гибкость, поскольку вы можете предоставить JSONDecoder
, настроенный так, как вам нужно.
struct Payload: Content {
var date: Date
}
Если вы хотите отправить даты в виде UNIX-отметки времени
router.post("check") { req throws -> Future<String> in
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970 // choose it for unix-timestamp
return try req.content.decode(json: Payload.self, using: decoder).map { p in
return String(describing: p.date)
}
}
Если вы хотите отправлять даты в своем собственном формате
router.post("check") { req throws -> Future<String> in
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = TimeZone(secondsFromGMT: 0)
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter) // custom date formatter
return try req.content.decode(json: Payload.self, using: decoder).map { p in
return String(describing: p.date)
}
}
Так что для метки времени unix вы должны отправить секунды с 1970 года и, например, 0
будет декодировано до 1970-01-01 00:00:00 +0000
.
А для пользовательского формата, описанного выше, вы должны отправить даты вроде 2018-01-01 00:00:00
, чтобы декодировать его как 2018-01-01 00:00:00 +0000
UPD: вы можете написать расширение, чтобы красиво его декодировать
extension ContentContainer where M: Request {
func decodeJson<D>(_ payload: D.Type) throws -> Future<D> where D: Decodable {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = TimeZone(secondsFromGMT: 0)
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)
return try decode(json: payload, using: decoder)
}
}
так что тогда вы сможете декодировать свою полезную нагрузку вот так
router.post("check") { (req) throws -> Future<String> in
return try req.content.decodeJson(Payload.self).map { p in
return String(describing: p.date)
}
}