如何在30分钟内用Swift编写REST API

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

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

开始课程

引言:为什么在 Swift 上构建 REST API 快速又现代

为 iOS 和 macOS 开发移动应用不仅需要漂亮的界面,还需要可靠的服务器后端。REST API(表现层状态转移)仍然是客户端与服务器之间数据交换的事实标准。如果您已经在使用 Swift 为苹果生态系统编写代码,那么用同一种语言创建 API 是顺理成章的一步。这样可以重用数据模型、避免代码重复,并能更快地实现变更。

在本文中,我们将向您展示如何使用 Vapor 框架(Swift 最流行的 Web 框架)编写一个完整的 REST API。您将学习如何设置项目、创建路由、处理 JSON 以及运行服务器。整个流程不会超过 30 分钟。准备好了吗?开始吧!



1. 环境设置与安装 Vapor

在编写代码之前,请确保已安装必要的工具。使用 Vapor 需要 Swift 5.9 或更高版本(推荐使用 Swift 6)。您还需要一个终端和一个代码编辑器(Xcode 或 VS Code)。

安装 Vapor Toolbox

Vapor Toolbox 是一个命令行工具,可简化创建和管理项目的流程。通过 Homebrew 安装:

brew install vapor

如果尚未安装 Homebrew,请从 brew.sh 下载。安装后,检查版本:

vapor --version

创建新项目

打开终端并运行命令:

vapor new MyAPI --template=api

--template=api 标志会为 REST API 创建一个基本结构,不包含多余文件。进入项目文件夹:

cd MyAPI

现在在 Xcode 中打开项目:

open Package.swift

或者使用任何其他编辑器。完成!您已拥有一个干净的 Vapor 模板。



2. 基本结构:模型、控制器与路由

Vapor 采用了适用于服务器端开发的 MVC(模型-视图-控制器)架构。我们将创建一个简单的待办事项列表管理 API。

创建模型

模型是描述数据的结构。在 Sources/App/Models/ 文件夹中,创建文件 Todo.swift:

import Fluentimport Vapor

final class Todo: Model, Content { static let schema = "todos" @ID(key: .id) var id: UUID? @Field(key: "title") var title: String @Field(key: "is_completed") var isCompleted: Bool init() { } init(id: UUID? = nil, title: String, isCompleted: Bool = false) { self.id = id self.title = title self.isCompleted = isCompleted }}

我们使用了 Fluent——Vapor 用于操作数据库的 ORM。由于采用了 Content 协议,模型会自动序列化为 JSON。

创建控制器

控制器包含请求处理逻辑。创建文件 Sources/App/Controllers/TodoController.swift:

import Vaporimport Fluent

struct TodoController: RouteCollection { func boot(routes: RoutesBuilder) throws { let todos = routes.grouped("todos") todos.get(use: index) todos.post(use: create) todos.group(":todoID") { todo in todo.delete(use: delete) } } // GET /todos — 获取所有任务 func index(req: Request) async throws -> [Todo] { try await Todo.query(on: req.db).all() } // POST /todos — 创建任务 func create(req: Request) async throws -> Todo { let todo = try req.content.decode(Todo.self) try await todo.save(on: req.db) return todo } // DELETE /todos/:id — 删除任务 func delete(req: R

博客

书籍推荐