Swift API:从理论到实际请求
\n\n每位iOS开发者迟早都会遇到应用与服务器通信的需求。无论是加载新闻流、提交表单数据还是实时流媒体——都离不开API(应用程序编程接口)。但该选择哪种协议?经典的REST、灵活的GraphQL还是超高速的gRPC?
\n\n本文不仅会列举优缺点。我们将通过实际示例深入讲解Swift API开发,展示代码并提供实用建议。您将学习如何正确构建网络层、使用哪些库以及每种方法何时是最佳选择。
\n\n如果您正在使用Swift编写代码,并希望您的应用能够快速、可靠且优雅地与后端通信——本文正是为您准备的。开始吧!
\n\nSwift中的REST API:永不过时的经典
\n\nREST(表述性状态转移)是一种使用HTTP方法(GET、POST、PUT、DELETE)操作资源的架构风格。大多数公共API(GitHub、Twitter、Stripe)都基于REST构建。对于Swift开发者而言,这意味着您将使用JSON、URLSession或Alamofire。
\n\n使用URLSession的基本GET请求
\n\n从最简单的开始——获取数据。假设我们需要从JSONPlaceholder加载用户列表:
\n\nimport Foundation\n\nstruct User: Codable {\n let id: Int\n let name: String\n let email: String\n}\n\nfunc fetchUsers() async throws -> [User] {\n let url = URL(string: "https://jsonplaceholder.typicode.com/users")!\n let (data, response) = try await URLSession.shared.data(from: url)\n \n guard let httpResponse = response as? HTTPURLResponse,\n (200...299).contains(httpResponse.statusCode) else {\n throw URLError(.badServerResponse)\n }\n \n return try JSONDecoder().decode([User].self, from: data)\n}\n\nTask {\n do {\n let users = try await fetchUsers()\n print("已加载 \\(users.count) 位用户")\n } catch {\n print("错误: \\(error.localizedDescription)")\n }\n}\n\n请注意使用async/await——这是Swift中处理异步代码的现代方式。代码变得可读且简洁,无需闭包和回调。
使用Alamofire的POST请求
\n\nAlamofire是最流行的Swift网络请求库。它简化了错误处理、参数编码和文件上传。以下是发送数据的示例:
\n\nimport Alamofire\n\nstruct NewUser: Encodable {\n let name: String\n let email: String\n}\n\nAF.request("https://jsonplaceholder.typicode.com/users",\n method: .post,\n parameters: NewUser(name: "伊万", email: "ivan@example.com"),\n encoder: JSONParameterEncoder.default)\n .validate()\n .responseDecodable(of: User.self) { response in\n switch response.result {\n case .success(let user):\n print("已创建用户,id: \\(user.id)")\n case .failure(let error):\n print("错误: \\(error.localizedDescription)")\n }\n }\n\n提示:使用.validate()——它会自动检查状态码并将HTTP错误转换为Alamofire错误。您的代码会更简洁,调试也更简单。
何时REST是最佳选择?
\n- \n
- 您有简单的CRUD应用(笔记、任务列表)。 \n
- API提供固定的端点。 \n
- 您不需要复杂的数据嵌套。 \n
Swift中的GraphQL:灵活的查询
\n\nGraphQL是一种查询语言,允许客户端精确请求所需的数据。没有过度获取(多余字段)或获取不足(需要多次请求)。对于Swift,有出色的库Apollo iOS