You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python后端对接iOS Swift前端实现GET API调用遇代码报错求助

解决Swift调用GET API对接Python后端的两个常见问题

看起来你在尝试用Swift调用Python后端的GET接口时遇到了语法和作用域相关的问题,我来帮你逐个分析并修正:

方案一:老Swift语法的重复声明与API过时问题

你的第一个代码片段报错consecutive declarations on a line must be separated by ;,核心问题有两个:

  1. 重复声明变量:completionHandler的参数里已经定义了error: NSError!,你在闭包内部又重新声明了同名的error变量,导致命名冲突;
  2. 使用过时APINSMutableURLRequestNSURLConnection都是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

火山引擎 最新活动