Python后端对接iOS Swift前端实现GET API调用遇代码报错求助
解决Swift调用GET API对接Python后端的两个常见问题
看起来你在尝试用Swift调用Python后端的GET接口时遇到了语法和作用域相关的问题,我来帮你逐个分析并修正:
方案一:老Swift语法的重复声明与API过时问题
你的第一个代码片段报错consecutive declarations on a line must be separated by ;,核心问题有两个:
- 重复声明变量:completionHandler的参数里已经定义了
error: NSError!,你在闭包内部又重新声明了同名的error变量,导致命名冲突; - 使用过时API:
NSMutableURLRequest、NSURLConnection都是Swift 2及更早版本的旧API,现代Swift已经推荐使用URLSession系列接口。
修正后的适配现代Swift版本的代码:
let urlString = "http://google.com?test=toto&test2=titi" guard let url = URL(string: urlString) else { print("Invalid URL format") return } var request = URLRequest(url: url) request.httpMethod = "GET" let task = URLSession.shared.dataTask(with: request) { data, response, error in // 先处理请求错误 if let error = error { print("Request failed: \(error.localizedDescription)") return } // 校验是否收到数据 guard let data = data else { print("No data received from server") return } // 解析JSON数据 do { if let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { // 在这里处理返回的JSON数据 print("Parsed JSON: \(jsonResult)") } } catch let jsonError { print("JSON parsing error: \(jsonError.localizedDescription)") } } task.resume()
方案二:变量作用域错误
第二个代码片段里第11行的data未被识别,原因很简单:data是闭包completionHandler内部的参数,只能在闭包范围内访问,你把guard let responseData = data else写在了闭包外面,自然找不到这个变量。
修正后的代码:
override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor(red: 255/255.0, green: 200/255.0, blue: 100/255.0, alpha: 1) guard let url = URL(string:"http://127.0.0.1:5000/") else { print("Invalid backend URL") return } let urlRequest = URLRequest(url: url) let session = URLSession.shared let task = session.dataTask(with: urlRequest) { data, response, error in // 先处理请求错误 guard error == nil else { print("Error calling GET on backend: \(error!.localizedDescription)") return } // 校验数据,这里的data是闭包内的参数,作用域正确 guard let responseData = data else { print("Error: did not receive data from backend") return } // 解析后端返回的JSON数据(如果后端返回JSON格式的话) do { if let jsonResponse = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] { print("Backend response: \(jsonResponse)") // 如果需要更新UI,必须切回主线程 DispatchQueue.main.async { // 在这里处理UI更新,比如刷新列表、修改标签文字等 } } } catch let parseError { print("JSON parsing error: \(parseError.localizedDescription)") } } task.resume() // 别忘了启动网络任务! }
额外提醒:如果你的Python后端运行在本地(127.0.0.1),iOS模拟器可以直接访问,但如果是真机测试,需要把IP换成你的电脑局域网IP;另外,生产环境建议使用HTTPS,测试阶段如果要用HTTP,需要在Info.plist里配置ATS允许非HTTPS请求。
内容的提问来源于stack exchange,提问作者Hashim Abu Sharkh




