Alamofire POST请求报错:如何将Foundation.URLRequest转为URLConvertible?
解决Alamofire中Foundation.URLRequest无法转换为URLConvertible的问题
问题场景
尝试使用Alamofire发送带JSON请求体的POST请求时,运行报错:
Could not cast value of type 'Foundation.URLRequest' to 'Alamofire.URLConvertible'
原请求代码如下:
let credential = URLCredential(user: appDelegate.username!, password: appDelegate.password!, persistence: .none) var url = URL(string: webservice) var request = URLRequest(url: url!) request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") request.httpMethod = "POST" request.httpBody = jsonData let urlRequest: Alamofire.URLRequestConvertible = request AF.request(urlRequest as! URLConvertible, headers: headers).authenticate(with: credential).response { response in }
核心解决方法
Foundation.URLRequest本身已经遵循了Alamofire的URLRequestConvertible协议,不需要任何强制转换,直接将构建好的request传入AF.request即可。修改后的请求代码如下:
let credential = URLCredential(user: appDelegate.username!, password: appDelegate.password!, persistence: .none) guard let url = URL(string: webservice) else { // 处理URL初始化失败的情况 return } var request = URLRequest(url: url) request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") request.httpMethod = "POST" request.httpBody = jsonData // 直接传入request,无需强制转换 AF.request(request, headers: headers).authenticate(with: credential).response { response in // 处理响应 }
额外代码问题修复
除了转换错误,你的代码还有几个潜在问题需要修正:
MyClass初始化方法类型不匹配
类中notes属性是String?,但初始化方法的notes参数是Int?,类型不一致,修改为:class MyClass: NSObject { var id: Int? var item: String? var notes: String? init(id: Int?, item: String?, notes: String?) { super.init() self.id = id self.item = item self.notes = notes } }JSON数据处理的可选值安全
jsonData是可选类型,直接赋值给httpBody可能导致请求体为空,建议添加错误处理:do { let jsonData = try JSONSerialization.data(withJSONObject: jsonArrayOfDictionaries, options: .prettyPrinted) request.httpBody = jsonData } catch { print("JSON序列化失败:\(error)") return }循环中冗余的字典初始化
循环内无需重复执行jsonDict = [AnyHashable: Any](),因为每次循环开头已经通过var jsonDict = [AnyHashable: Any]()创建了新字典:var jsonArrayOfDictionaries = [[AnyHashable: Any]]() for item in cellHolder { var jsonDict = [AnyHashable: Any]() jsonDict["ID"] = item.id jsonDict["item"] = item.item jsonDict["Notes"] = item.notes jsonArrayOfDictionaries.append(jsonDict) }
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

