如何将Optional<Dictionary<String, Any>>转换为字典用于Alamofire 5.4.4发Post JSON请求
问题原因
从控制台输出可以看到两个核心错误:
- 你传入
postLoginRequest方法的parameters字典中,username和password对应的value是UITextField控件对象本身,而不是控件输入的文本字符串,后端无法识别控件对象类型的数据 - 字典的value、字典本身都是可选类型,直接序列化会产生不必要的可选嵌套结构,不符合后端参数接收规则
解决方案
步骤1:构造参数时传入正确的文本值
在调用postLoginRequest方法前,构造参数时需要主动取UITextField的text属性作为值:
// 调用接口前构造参数示例 let params: Parameters = [ "username": usernameInputTextField.text ?? "", "password": passwordInputTextField.text ?? "" ] // 传入请求方法 YourNetworkTool.postLoginRequest(url: loginUrl, parameters: params, success: { res in // 成功逻辑 }, failure: { error in // 失败逻辑 })
步骤2:请求方法内部统一处理可选参数
修改postLoginRequest的内部逻辑,对可选参数做解包、空值过滤:
class func postLoginRequest(url: String, parameters: Parameters?, success: @escaping (Any) -> Void, failure: @escaping (NetworkError) -> Void) { guard Network.isAvailable else { failure(NetworkError.networkUnavailable) return } // 解包+过滤字典内的nil值,生成可正常序列化的参数 guard let validParams = parameters?.compactMapValues({ $0 }) as? [String: Any] else { failure(NetworkError.invalidParameters) return } let manager = Alamofire.Session.default manager.session.configuration.timeoutIntervalForRequest = Constants.NetworkError.timeOutInterval manager.request(url, method: .post, parameters: validParams, encoding: JSONEncoding.default ) .validate(statusCode: 200..<600) .responseJSON { response in // 原有响应处理逻辑 } }
处理后生成的validParams结构和你硬编码的测试参数完全一致,Django后端可以正常解析完成认证。
内容的提问来源于stack exchange,提问作者uyarc
相关产品推荐
相关产品推荐

