0Pricing
Swift Academy · 课时

路由与请求处理

定义路由并处理 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 路由与请求处理
  2. 内容与 JSON 编码
  3. Fluent ORM 与模型
  4. 中间件与身份验证
← 返回 Swift Academy