Swift HTTP客户端:正确发起请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为何正确的 HTTP 请求是所有应用程序的基础



在当今使用 Swift 开发的移动端和桌面端应用中,几乎找不到完全独立运行的应用。几乎所有 iOS 或 macOS 应用都需要与远程服务器交互:加载数据、发送表单、同步内容。HTTP 客户端是关键组件,其质量不仅影响性能,更关乎整个应用的安全与稳定。



本文将深入讲解如何利用 Swift 内置的 Foundation 框架构建可靠的 HTTP 客户端。您将学习如何正确配置 URLSession、处理错误、操作 JSON,以及运用 async/await 等现代开发方法。无论您是刚接触 Swift 的新手,还是希望系统梳理知识体系的资深开发者,本文都将为您提供实用价值。



1. URLSession 基础:网络交互的基石



在 Swift 中,HTTP 操作的主要工具是 URLSession 类。作为 Foundation 框架的组成部分,它提供了灵活的 API 用于发送请求和接收响应。URLSession 支持多种配置,可根据具体任务调整其行为。



创建与配置会话



第一步是使用特定配置创建 URLSession 实例。共有三种配置类型:



  • .default — 标准配置,启用缓存和 Cookie 持久化;
  • .ephemeral — 不将数据写入磁盘(Cookie、缓存仅保留在内存中);
  • .background — 用于后台任务,即使应用关闭也能继续运行。


创建自定义配置的会话示例:



let configuration = URLSessionConfiguration.defaultconfiguration.timeoutIntervalForRequest = 30configuration.waitsForConnectivity = true

let session = URLSession(configuration: configuration)


请注意 waitsForConnectivity 参数:若设为 true,当网络不可用时请求不会立即报错,而是等待连接恢复。这对移动应用尤为重要。



基本 GET 请求



执行请求的最简单方式是使用 dataTask(with:) 方法。以下是最简示例:



guard let url = URL(string: "https://api.example.com/users") else { return }

let task = session.dataTask(with: url) { data, response, error in if let error = error { print("请求错误:\\(error.localizedDescription)") return } guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("无效的服务器响应") return } guard let data = data else { print("未获取到响应数据") return } // 数据处理 print("已接收 \\(data.count) 字节")}task.resume()


重要提示:务必调用 resume(),否则请求不会启动。这是初学者最常犯的错误之一。



2. JSON 处理:从数据到对象



现代 API 大多以 JSON 格式返回数据。Swift 使用 Codable 协议处理 JSON,该协议整合了 Encodable 和 Decodable,可轻松实现数据与模型之间的相互转换。



创建模型与解码



假设服务器返回如下格式的用户列表:



[    {        "id": 1,        "name": "Ivan Petrov",        "email": "ivan@example.com"    }]


让我们创建对应的结构体:



struct User: Codable                

博客

书籍推荐