GraphQL API 与 Swift:逐步实践教程

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

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

开始课程

引言:为什么 GraphQL 和 Swift 是完美组合

现代 iOS 开发离不开与服务器的高效交互。REST API 正逐渐让位于更灵活、更高性能的技术——GraphQL。在本教程中,我们将详细讲解如何使用 Apollo iOS 库将 GraphQL API 集成到 Swift 应用程序中。

GraphQL 允许您精确请求所需的数据——不多不少。对于 Swift 来说,这意味着减少流量、提升性能并简化代码。我们将从项目设置到执行复杂查询和变更,走完整个流程。



1. 项目设置与安装 Apollo iOS

第一步是准备 Xcode 项目并安装依赖项。最方便的方式是通过 Swift Package Manager。



1.1 创建新项目

打开 Xcode 并创建一个新项目(iOS App 或 macOS App)。选择 SwiftUI 或 UIKit 都可以。将其命名为 GraphQLDemo。



1.2 通过 SPM 添加 Apollo iOS

  1. 在 Xcode 中,前往:File → Add Package Dependencies...
  2. 粘贴仓库 URL:https://github.com/apollographql/apollo-ios.git
  3. 选择最新的稳定版本,点击 Add Package。
  4. 确保该包已添加到您的应用目标中。


1.3 生成 Schema 代码

Apollo iOS 使用代码生成。为此,我们需要一个 schema 文件 .graphqls(通常从服务器下载)和查询文件 .graphql。

// 项目结构:// GraphQLDemo/// ├── GraphQL/// │   ├── schema.graphqls      // 服务器 schema// │   ├── Queries.graphql      // 查询// │   └── Mutations.graphql    // 变更

添加文件后,通过终端运行代码生成:

cd /path/to/project./Pods/Apollo/apollo-ios-cli --download-schema --endpoint=https://your-server/graphql./Pods/Apollo/apollo-ios-cli --generate

现在您已经有了包含类型和查询的生成 Swift 文件。



2. Swift 中的基本查询

我们来看一个获取用户列表的简单查询。假设我们的 schema 包含一个 User 类型,字段为 id、name、email。



2.1 创建 .graphql 文件

在 GraphQL 文件夹中,创建一个文件 Queries.graphql:

query GetUsers {  users {    id    name    email  }}


2.2 在 Swift 中执行查询

首先,初始化 Apollo 客户端:

import Apollo

class NetworkManager { static let shared = NetworkManager() let apollo: ApolloClient private init() { let url = URL(string: "https://your-server/graphql")! apollo = ApolloClient(url: url) }}

现在在任何 ViewController 或 ViewModel 中执行查询:

import SwiftUI

struct UsersView: View { @State private var users: [GetUsersQuery.Data.User] = [] var body: some View { List(users, id: \\.id) { user in VStack(alignment: .leading) { Text(user.name) .font(.headline) Text(user.email) .font(.subheadline) .foregroundColor(.gray) } } .onAppear { loadUsers() } } private func loadUsers() { NetworkManager.shared.apollo.fetch(query: GetUsersQuery()) { result in switch result { case .success(let graphQLResult): if let usersData = graphQLResult.data?.users { self.users = usersData } case .failure(let error): print("Error: \\(error.localizedDescri") } } }}

博客

书籍推荐