做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秒没人按,人就走楼梯了。