电脑知识铺
第二套高阶模板 · 更大气的阅读体验

Swift开发网络请求:轻松搞定iOS端数据交互

发布时间:2025-12-23 09:20:52 阅读:201 次

做iOS开发,免不了跟服务器打交道。比如你写个天气App,总得从后台拉数据吧?这时候就得用到Swift开发网络请求。别被这词吓到,其实没那么复杂,就像点外卖——你下单(发请求),商家接单准备(服务器处理),最后骑手把饭送过来(返回数据)。

URLSession 是你的基础工具

iOS原生提供了URLSession,是发网络请求的标配。它支持GET、POST这些常见方式,轻量又高效。比如你想从一个API获取用户信息,写法很简单:

let url = URL(string: "https://api.example.com/user")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("请求出错:$0)")
        return
    }
    
    if let data = data,
       let string = String(data: data, encoding: .utf8) {
        print("收到数据:$string)")
    }
}
task.resume()

这段代码就像你打开浏览器访问网页,只不过结果在后台打印出来。注意dataTask默认不自动执行,得调resume()启动,不然请求就卡着不动。

处理JSON数据更贴近实际场景

现在大多数接口返回的都是JSON。假设你做个登录功能,服务器回传的是这样的数据:

{
  "success": true,
  "message": "登录成功",
  "user_id": 12345
}

你可以定义一个结构体来接收:

struct LoginResponse: Codable {
    let success: Bool
    let message: String
    let userId: Int

    enum CodingKeys: String, CodingKey {
        case success, message
        case userId = "user_id"
    }
}

然后在请求里用JSONDecoder解析:

if let data = data {
    do {
        let result = try JSONDecoder().decode(LoginResponse.self, from: data)
        if result.success {
            print("欢迎用户 $result.userId)")
        }
    } catch {
        print("解析失败:$error)")
    }
}

别忘了加请求头和参数

有些接口需要带token验证,这就得加请求头。比如你要上传数据,还得改成POST,并附上body:

var request = URLRequest(url: URL(string: "https://api.example.com/login")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer abc123", forHTTPHeaderField: "Authorization")

let body = ["username": "test", "password": "123"]
do {
    request.httpBody = try JSONSerialization.data(withJSONObject: body)
} catch {
    print("拼接body失败")
}

let task = URLSession.shared.dataTask(with: request) { data, _, _ in
    // 处理响应
}
task.resume()

这种写法在真实项目里很常见,比如用户登录、提交表单。header里带token,就像是进门刷工卡,没卡就不让进。

网络问题也得考虑周全

不是每次请求都能顺利回来。Wi-Fi信号差、服务器宕机、接口改了路径,都会导致失败。所以回调里的error判断不能少,同时建议加个超时时间:

var config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 10  // 10秒超时
let session = URLSession(configuration: config)

这样避免用户一直转圈等不到结果。用户体验就跟等电梯一样,超过15秒没人按,人就走楼梯了。