路由与请求处理
定义路由并处理 HTTP 请求。
路由与请求处理 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
什么是 Vapor
Vapor 是一个基于 SwiftNIO 构建的热门服务器端 Swift Web 框架。它让您可以完全使用 Swift 编写 HTTP 后端(API、网站),与 iOS 应用共享语言,甚至共享模型。
import Vapor
let app = try await Application.make(.detect())应用程序与路由
Application 对象是 Vapor 服务器的核心。您可以在其中注册路由:将 HTTP 方法和路径映射到处理程序闭包,由该闭包返回响应。
app.get("hello") { req in
"Hello, world!"
}HTTP 方法辅助工具
Vapor 为每个 HTTP 动词提供了一个辅助工具:app.get、app.post、app.put、app.patch 和 app.delete。每个辅助工具都接受路径组件和一个处理程序。
app.post("users") { req in
"Created a user"
}
app.delete("users") { req in
"Deleted a user"
}路径片段
传入多个字符串片段即可构建嵌套路由。下面的调用会响应 GET /api/v1/status。
app.get("api", "v1", "status") { req in
"OK"
}路由参数
使用以冒号开头的片段来捕获动态值。通过 req.parameters.get(_:) 从请求中读取该值。下面的示例中,请求 /users/42 会捕获 42。
app.get("users", ":id") { req -> String in
let id = req.parameters.get("id") ?? "unknown"
return "User id is " + id
}类型化参数
将类型传递给 get,即可把参数转换为具体类型。如果转换失败,Vapor 会自动返回 404,从而让处理程序保持简洁。
app.get("posts", ":id") { req -> String in
let id = try req.parameters.require("id", as: Int.self)
return "Post number " + String(id)
}查询参数
通过 req.query 读取 URL 查询项。对于 /search?term=swift,您可以直接解码该查询项。缺失的可选值会直接以 nil 返回。
app.get("search") { req -> String in
let term = try req.query.get(String.self, at: "term")
return "Searching for " + term
}路由组
使用 app.grouped(...),可以将相关路由归入共享前缀下。这样可以避免重复路径组件,并让相关端点保持在一起。
let users = app.grouped("users")
users.get { req in "List users" } // GET /users
users.post { req in "Create user" } // POST /users返回不同的响应类型
处理程序可以返回 String、HTTPStatus、自定义的 Content 类型或完整构建的 Response。Vapor 知道如何将每种类型编码为 HTTP 回复。
app.delete("cache") { req -> HTTPStatus in
// clear something
return .noContent // 204
}使用 Abort 抛出错误
抛出 Abort(_:) 可以使用特定的 HTTP 状态和可选原因提前结束请求。Vapor 会将其转换为简洁的 JSON 错误响应。
app.get("secret") { req -> String in
guard req.headers.first(name: "X-Key") == "open" else {
throw Abort(.forbidden, reason: "Missing key")
}
return "Welcome"
}异步处理程序
Vapor 4+ 完全支持 async/await。将处理程序闭包标记为异步,并在其中使用 try await 执行数据库或网络操作。
app.get("ping") { req async throws -> String in
try await Task.sleep(for: .milliseconds(10))
return "pong"
}快速检查:路由
请确认您对路由的理解。
回顾:路由与请求处理
现在您可以配置 Vapor 服务器:
- 使用
app.get/post/put/patch/delete和路径片段注册路由。 - 使用
:param捕获动态值,并通过req.parameters读取它们(使用require(_:as:)指定类型)。 - 从
req.query读取查询项,并使用grouped对路由进行分组。 - 返回字符串、状态或内容;使用
Abort抛出错误;使用异步处理程序。
常见问题解答
「路由与请求处理」课时是免费的吗?
是的 — 「路由与请求处理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「路由与请求处理」这节课中我会学到什么?
定义路由并处理 HTTP 请求。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「路由与请求处理」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。