【问题标题】:Swift Alamofire - POST request using parameters of NULL valueSwift Alamofire - 使用 NULL 值参数的 POST 请求
【发布时间】:2020-11-09 12:57:33
【问题描述】:

我在下面有 Alamofire POST 请求,我的参数值是可选的。我想允许用户调用这个 API 来设置所需的参数,即使它是 NULL(它有点重置为空的默认值)。

这是我的请求,参数status 是一个可选变量,它应该接受空值:

let URL_UPDATE_STATUS = URL_HOME + "/v1/updateStatus/" + dataId
let parameters: [String : Any] = ["status": status as Any]
                
Alamofire.request(URL_UPDATE_STATUS, method: .post, parameters: parameters, encoding: URLEncoding(destination: .queryString), headers: self.headers).responseString { response in
    switch response.result {
    case .success:
        print("[Log] Update Status Success")
    case .failure(let error):
        print("[ERROR] UpdateStatus - \(error)")
                
        APIErrorHandler(response: response, error: error)
    }
}

但是,我尝试了几次,它总是返回一些错误。我试图是可选的,但我发现它没有被插值(即它变成"Optional(\"SOME_STATUS\")")。当我试图强制解开字符串时,那些空值会导致致命错误。而且,我尝试了将 null 作为请求参数的值传递的方法,但它仍然不起作用。

我不明白我应该如何解决它,有人可以帮忙吗?非常感谢!

【问题讨论】:

  • 如果 Optional 值为 nil,那么您将强制将 nil 值强制转换为 Any ,这会使其崩溃。 let parameters: [String : Any] = ["status": status as Any]
  • 谢谢@Same7Farouk!我试图强制转换nil,因为它会使参数值看起来像"Optional(\"SOME_STATUS\")"...

标签: ios swift post alamofire optional


【解决方案1】:

您可以创建参数字典,然后为其赋值。 在这种情况下,它们的键值要么不存在。

var parameters: [String : Any] = [:]
parameters["status"] = status

【讨论】:

  • 谢谢僵尸!但我打算使用nil 值设置参数(即类似status=NULL 作为POST 请求的查询字符串),以某种方式重置状态标志。
  • @markandshare nil 表示参数key不存在与不发送相同。或者你的意思是NSNull()
  • 我之前尝试过传递 NSNull() 但状态将设置为类似"<null>" 的字符串...我是否使用了错误的编码方法,结果如何?
【解决方案2】:

不要传递空参数,你可以检查它是否具有传递它的值

检查此代码

let URL_UPDATE_STATUS = URL_HOME + "/v1/updateStatus/" + dataId
var parameters: [String : Any]? = nil
if let status = status {
    parameters  = ["status": status]
}
Alamofire.request(URL_UPDATE_STATUS, method: .post, parameters: parameters, encoding: URLEncoding(destination: .queryString), headers: self.headers).responseString { response in
        switch response.result {
        case .success:
            print("[Log] Update Status Success")
        case .failure(let error):
            print("[ERROR] UpdateStatus - \(error)")
                
        APIErrorHandler(response: response, error: error)
    }
}

【讨论】:

  • 感谢 Same7Farouk!我没有设置参数nil,但我需要使用nil 值设置参数(即类似status=NULL 作为POST 请求的查询字符串),以某种方式重置状态标志。
【解决方案3】:

https://github.com/Alamofire/Alamofire/issues/2407

您只需将 nil 作为值传递,Alamofire 就会完成所有的魔法。问题很可能出在其他地方。

【讨论】:

  • 感谢 Ctibor Šebák!我也尝试传递nil,但结果是使参数值为"Optional(\"SOME_STATUS\")"...
最近更新 更多