swift-url-routing

一个具有更高类型安全性和更少麻烦的双向 URL 路由器。此库构建于 Parsing 之上。


了解更多

本库在 Point-Free 的一集节目中进行了讨论,Point-Free 是一个探索函数式编程和 Swift 编程以及 Swift 语言的视频系列,由 Brandon WilliamsStephen Celis 主持。

video poster image

动机

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