GraphQL API 与 Swift:实践分步教程

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

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

开始课程

GraphQL 和 Swift 简介

\n

GraphQL 是一种 API 查询语言,它允许客户端精确获取所需的数据,不多不少。对于 iOS 和 macOS 开发者来说,集成 GraphQL 为创建高效灵活的移动应用开辟了新的可能性。在本教程中,我们将通过实践学习如何将 GraphQL API 连接到 Swift 项目,执行基本查询和变更,并处理可能出现的错误。

\n

与传统的 REST 不同,GraphQL 允许通过一次请求获取多个资源,这对于流量受限的移动设备尤为重要。我们将使用流行的 Apollo iOS 库——这是 Swift 中处理 GraphQL 最稳定且文档最完善的解决方案。

\n\n

项目准备与 Apollo iOS 安装

\n

步骤 1:创建项目并安装依赖

\n

打开 Xcode 并创建一个新的 iOS(或 macOS)项目。我们将通过 Swift Package Manager (SPM) 安装 Apollo iOS 以使用 GraphQL。

\n
    \n
  1. 在 Xcode 中选择 File → Add Packages
  2. \n
  3. 粘贴仓库 URL:https://github.com/apollographql/apollo-ios.git
  4. \n
  5. 选择最新的稳定版本(撰写本文时为 1.15+)
  6. \n
  7. 将包添加到您的目标中
  8. \n
\n\n

步骤 2:根据 GraphQL 模式生成代码

\n

Apollo iOS 使用代码生成:您在 .graphql 文件中描述查询,工具会生成类型化的 Swift 代码。为此,您需要:

\n
    \n
  1. 在项目中创建 GraphQL 文件夹
  2. \n
  3. 将 schema.graphqls 文件(您的 API 模式)放入其中——通常可以通过 introspection 获取
  4. \n
  5. 创建一个查询文件,例如 GetUser.graphql:
  6. \n
\n\n
query GetUser($id: ID!) {\n  user(id: $id) {\n    id\n    name\n    email\n    posts {\n      title\n    }\n  }\n}
\n\n

然后添加一个运行代码生成器的 Build Phase。最简单的方法是通过 Homebrew 安装 Apollo CLI:

\n
brew install apollo-ios-cli
\n\n

并在项目根目录执行命令:

\n
./apollo-ios-cli generate
\n\n

之后,在 Sources/API 文件夹中将出现包含数据模型的生成 Swift 文件。

\n\n

执行基本 GraphQL 查询

\n

配置 Apollo 客户端

\n

创建一个 Apollo 客户端实例,指定您的 GraphQL 端点 URL。通常在 AppDelegate 或单独的服务类中完成:

\n\n
import Apollo\n\nclass NetworkService {\n    static let shared = NetworkService()\n    private(set) lazy var apollo: ApolloClient = {\n        let url = URL(string: "https://your-api.com/graphql")!\n        return ApolloClient(url: url)\n    }()\n}
\n\n

数据查询 (Query)

\n

现在执行一个获取用户的查询。生成的代码会创建 GetUserQuery 结构体:

\n\n
import Foundation\n\nclass UserViewModel: ObservableObject {\n    @Published var user: User?\n    @Published var errorMessage: String?\n    \n    func fetchUser(id: String) {\n        NetworkService.shared.apollo.fetch(query: GetUserQuery(id: id)) { [weak self] result in\n            DispatchQueue.main.async {\n                switch result {\n                case .success(let graphQLResult):\n                    if let userData = graphQLResult.data?.user {\n                        self?.user = User(\n                            id: userData.id,\n                            name: userData.name,\n                            email: userData.email\n                        )\n                    }\n                case .failure(let error):\n                    self?.errorMessage = "错误: \\(error.localizedDescription)"\n                }\n            }\n        }\n    }\n}
\n\n

请注意:我们使用 @Published 来实现 UI 的响应式更新,在

博客

书籍推荐