使用 Alamofire 为参数发送“Null”值
Posted
技术标签:
【中文标题】使用 Alamofire 为参数发送“Null”值【英文标题】:Sending a `Null` value for parameter with Alamofire 【发布时间】:2016-10-13 20:13:50 【问题描述】:我已经更新到 Swift3 和最新的 Alamofire '~> 4.0'
当我尝试设置我的参数时,我现在得到<null>
而不是null
用于我没有设置的设置。这与我的后端冲突。
有没有办法发送null
?
当我将值设置为 nil 时,它不包含在 put
中,字典会将其删除。但我需要发回所有值。
我的代码
func saveOfficeHours(days: [OfficeHours])
guard let URL = LocationInfo.shared.url else
assertionFailure("location URL is nil")
return
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
func formatTime(time: Date?) -> Any
guard let time = time else return NSNull()
return formatter.string(from: time)
var parameters: [String: Any] = [:]
for week in days
parameters["\(week.day)_hours_start"] = formatTime(time: week.hoursStart)
parameters["\(week.day)_hours_stop"] = formatTime(time: week.hoursEnd)
parameters["\(week.day)_lunch_hours_start"] = formatTime(time: week.lunchStart)
parameters["\(week.day)_lunch_hours_stop"] = formatTime(time: week.lunchEnd)
parameters["\(week.day)_break_hours_start"] = formatTime(time: week.breakStart)
parameters["\(week.day)_break_hours_stop"] = formatTime(time: week.breakEnd)
Alamofire.request(URL, method: .put, parameters: parameters, encoding: URLEncoding.httpBody, headers: API.workstationTokenAuthHeaders()).validate().responseJSON
response in
switch response.result
case .success:
print("Success setting office hours")
case .failure(let error):
print("Failure setting office hours: \n \n -------==========-------- \n \n\(error)\n \n -------==========-------- \n")
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:与其依靠 NSNull
通过 Alamofire 和通过 HTTP 发送的带有您的参数的数据之间的各种抽象来正确映射,我会执行以下操作:
func formatTime(time: Date?) -> String?
guard let time = time else return nil
return formatter.string(from: time)
var parameters: [String: Any] = [:]
for week in days
if let hoursStart = formatTime(time: week.hoursStart) parameters["\(week.day)_hours_start"] = hoursStart
if let hoursEnd = formatTime(time: week.hoursEnd) parameters["\(week.day)_hours_stop"] = hoursEnd
if let lunchStart = formatTime(time: week.lunchStart) parameters["\(week.day)_lunch_hours_start"] = lunchStart
if let lunchStop = formatTime(time: week.lunchEnd) parameters["\(week.day)_lunch_hours_stop"] = lunchStop
if let breakStart = formatTime(time: week.breakStart) parameters["\(week.day)_break_hours_start"] = breakHoursStart
if let breakEnd = formatTime(time: week.breakEnd) parameters["\(week.day)_break_hours_stop"] = breakEnd
顺便说一句,您的问题应该说明您在哪里看到 <null>
而不是 null
?在 Cocoa 中的一些日志记录调用中,还是在您的服务器端?尽管如此,更安全(并且可以说是 Swiftier,因为在上面的示例中 formatTime
具有有意义的返回类型)选项将高于 IMO。
【讨论】:
以上是关于使用 Alamofire 为参数发送“Null”值的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 Alamofire 的 POST 网络调用中仅发送字符串值作为参数?
URL编码参数中的布尔值在Swift3中使用Alamofire编码为0和1