# 网络请求（URLSession）

URL: https://caijiao.org/swift/15-advanced-practice/02-networking
Source: docs/swift/15-advanced-practice/02-networking.md
Description: 本章节介绍如何使用 Swift 的 URLSession 进行网络请求，涵盖基本用法、数据任务和错误处理，帮助开发者构建高效的网络通信功能。

在 Swift 中，URLSession 是进行网络请求的核心工具，支持数据下载、上传和后台任务。

## 基本用法

使用 URLSession 创建数据任务，发送 HTTP 请求并接收响应。

```swift
let url = URL(string: "https://api.example.com/data")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("请求失败：\(error.localizedDescription)")
        return
    }
    guard let data = data else {
        print("无数据返回")
        return
    }
    // 处理数据
    if let jsonString = String(data: data, encoding: .utf8) {
        print("返回数据：\(jsonString)")
    }
}
task.resume()
````

## JSON 数据解析

结合 `Codable` 协议解析 JSON 数据：

```swift
struct ResponseData: Codable {
    let id: Int
    let name: String
}

let task = URLSession.shared.dataTask(with: url) { data, _, error in
    guard let data = data, error == nil else { return }
    do {
        let result = try JSONDecoder().decode(ResponseData.self, from: data)
        print("解析结果：\(result.name)")
    } catch {
        print("解析错误：\(error.localizedDescription)")
    }
}
task.resume()
```

## 使用 async/await

Swift 并发支持 URLSession 的异步请求：

```swift
func fetchData() async throws -> ResponseData {
    let (data, _) = try await URLSession.shared.data(from: url)
    return try JSONDecoder().decode(ResponseData.self, from: data)
}

Task {
    do {
        let response = try await fetchData()
        print("异步请求结果：\(response.name)")
    } catch {
        print("请求失败：\(error)")
    }
}
```

## 小结

掌握 URLSession 网络请求及其异步处理，是开发网络应用的基础，提升数据交互效率和用户体验。
