一个具有更高类型安全性和更少麻烦的双向 URL 路由器。此库构建于 Parsing 之上。
本库在 Point-Free 的一集节目中进行了讨论,Point-Free 是一个探索函数式编程和 Swift 编程以及 Swift 语言的视频系列,由 Brandon Williams 和 Stephen Celis 主持。
URL 路由在客户端和服务器端应用程序中都是一个普遍存在的问题
此库为客户端和服务器应用程序提供 URL 路由功能,并以可组合、类型安全的方式进行。
要使用该库,您首先要进行领域建模练习。您需要对路由枚举进行建模,该枚举表示您想要在应用程序中识别的每个 URL,并且枚举的每种情况都包含您想要从 URL 中提取的数据。
例如,如果我们的 Books 应用程序中有表示显示所有书籍、显示特定书籍和搜索书籍的屏幕,我们可以将其建模为一个枚举
enum AppRoute {
case books
case book(id: Int)
case searchBooks(query: String, count: Int = 10)
}
请注意,我们只编码我们想要从这些情况下的 URL 中提取的数据。没有关于此数据在 URL 中位置的详细信息,例如它是否来自路径参数、查询参数或 POST body 数据。
这些细节由路由器确定,路由器可以使用此库中提供的工具构建。它的目的是将传入的 URL 转换为 AppRoute
类型。例如
import URLRouting
let appRouter = OneOf {
// GET /books
Route(.case(AppRoute.books)) {
Path { "books" }
}
// GET /books/:id
Route(.case(AppRoute.book(id:))) {
Path { "books"; Digits() }
}
// GET /books/search?query=:query&count=:count
Route(.case(AppRoute.searchBooks(query:count:))) {
Path { "books"; "search" }
Query {
Field("query")
Field("count", default: 10) { Digits() }
}
}
}
此路由器在高层次上描述了如何从 URL 中解析路径组件、查询参数等,以便将其转换为 AppRoute
。
一旦定义了此路由器,您就可以使用它在您的应用程序中实现深度链接逻辑。您可以实现一个接受 URL
的单函数,使用路由器的 match
方法将其转换为 AppRoute
,然后切换路由以处理每个深度链接目标
func handleDeepLink(url: URL) throws {
switch try appRouter.match(url: url) {
case .books:
// navigate to books screen
case let .book(id: id):
// navigate to book with id
case let .searchBooks(query: query, count: count):
// navigate to search screen with query and count
}
}
这种路由在客户端 iOS 应用程序中非常有用,但它也可以在服务器端应用程序中使用。更妙的是,它可以自动将 AppRoute
值转换回 URL,这对于链接到您网站的各个部分非常方便
appRouter.path(for: .searchBooks(query: "Blob Bio"))
// "/books/search?query=Blob%20Bio"
Node.ul(
books.map { book in
.li(
.a(
.href(appRouter.path(for: .book(id: book.id))),
book.title
)
)
}
)
<ul>
<li><a href="/books/1">Blob Autobiography</a></li>
<li><a href="/books/2">Blobbed around the world</a></li>
<li><a href="/books/3">Blob's guide to success</a></li>
</ul>
有关 Vapor 到 URL 路由的绑定,请参阅 Vapor Routing 包。
有关发布版本和 main 分支的文档,请访问 此处。
本库根据 MIT 许可证发布。有关详细信息,请参阅 LICENSE。