【问题标题】:Sending a `Null` value for parameter with Alamofire使用 Alamofire 为参数发送“Null”值
【发布时间】: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")
    }
  }
}

提前感谢您的帮助。

【问题讨论】:

    标签: swift nsdictionary swift3 alamofire nsnull


    【解决方案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。

    【讨论】: