如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A
Posted
技术标签:
【中文标题】如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 Alamofire (5.4.4) 发布请求?【英文标题】:How to convert Optional<Dictionary<String, Any>> to Dictionary<String, Any> to send Alamofire (5.4.4) post request with json paramters? 【发布时间】:2021-12-23 21:49:58 【问题描述】:class func postLoginRequest(url: String, parameters: Parameters?, success: @escaping (Any) -> Void, failure: @escaping (NetworkError) -> Void)
if Network.isAvailable
let param : [String : Any] = [
"username" : "x",
"password" : "x"
]
print (type(of: param))
print(param)
print(type(of: parameters))
print(parameters)
let manager = Alamofire.Session.default
manager.session.configuration.timeoutIntervalForRequest = Constants.NetworkError.timeOutInterval
manager.request(url, method: .post, parameters: param, encoding: JSONEncoding.default ).validate(statusCode: 200..<600).responseJSON (response) -> Void in ...
我的数据输出如下所示;
Dictionary<String, Any>
["username": "x", "password": "x"]
Optional<Dictionary<String, Any>>
Optional(["username": Optional(<TextFieldEffects.HoshiTextField: 0x11c054600; baseClass = UITextField; frame = (41 10; 286 40); text = 'x'; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x2821b45d0>; layer = <CALayer: 0x282f855c0>>), "password": Optional(<TextFieldEffects.HoshiTextField: 0x11c043600; baseClass = UITextField; frame = (41 10; 286 40); text = 'x'; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x2821afe40>; layer = <CALayer: 0x282f849c0>>)])
当我使用 param 作为参数时没问题。我可以在后端(DJango)中为 jwt auth 获取用户名和密码。但是当我使用参数作为参数值时我不能。如何进行这种转换以发送 json 正文数据。
【问题讨论】:
不要发送UITextField
作为值,发送textField.text
属性!如果需要,可以打开包装。
@Larme 非常感谢。错过是我的错。
除了您的要求之外,此代码并没有按照您的想法执行。首先,不要先检查网络可用性。苹果说不要这样做,它不会像你想象的那样工作。其次,您在将配置添加到URLSession
后对URLSessionConfiguration
的修改没有影响,因此您对timeoutIntervalForRequest
的设置没有任何作用。第三,timeoutIntervalForRequest
与URLRequest
的超时时间不同,所以它可能不是你想要的。
@JonShier 感谢您的意见。我会注意并检查。
【参考方案1】:
您需要 safely unwrap 将任何内容从 Optional 转换为 Type
let myDict: [String : Any]? = ["john" : "Appleseed"]
// 1. Using guard statements
guard let unwraped: [String : Any] = myDict else
// The value is nil
return
// 2. Using if statements
if let unwraped: [String : Any] = myDict
// unwraped value
else
// The value is nil
// 3. Using force unwrap (be careful, this will crash your app if myDict is nil)
let unwraped = myDict!
【讨论】:
【参考方案2】:我的错误是将 UITextField 作为值发送。我错过了。首先我解决了这个问题。之后我使用 URLEncoding.httpBody 对数据进行编码。
if Network.isAvailable
let manager = Alamofire.Session.default
manager.session.configuration.timeoutIntervalForRequest = Constants.NetworkError.timeOutInterval
manager.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody ).validate(statusCode: 200..<600).responseJSON (response) -> Void in
谢谢。
【讨论】:
以上是关于如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A
orElseGet 在 Optional<List<Entity>> 的情况下如何工作