Swift Web 开发之 Vapor - 路由(二)
上篇文章带大家基本了解了一下开始一个 Vapor 项目的流程,本篇紧接着来说说在所有 Web 框架中都最关键的 “路由”,因为 “路由” 模块在 Web 项目中担任很重要的角色,所以很多语言的 Web 框架都把 “路由” 抽离到框架层,从而减少开发者的工作量,一个设计得易用强大的 “路由” 系统也会给相应给框架增添不少色彩。 Web 开发中的路由这个概念简单来说就是 URL 路径到具体处理函数之间的映射,只有设定好了路由,访问者才能在浏览器根据相关 URL 规则进行页面跳转和访问,Vapor 对路由做了很多实用性设计,包括路由的构建、路由组、类型安全的路由参数、路由集合等等,希望看完本篇文章你能用 Vapor 写出一些简单的路由,我们先来看看 Vapor 最简单的路由注册。 Droplet注册路由之前我们需要知道 import Vapor
let drop = Droplet()
// your magic here
drop.run()
注册路由注册一个最基本的路由通过对全局 drop.get("welcome") { request in
return "Hello"
}
我们通过调用 另外我们还可以使用 drop.add(.trace,"welcome") { request in return "Hello" }
可能你会想明明上面已经提供了对应的方法来注册路由,为什么还要多一个 另外有一种关于多级路径的写法,直接使用参数分割,而不是在一个 String 参数中用 drop.get("foo","bar","baz") { request in
return "You requested /foo/bar/baz"
}
如果想在 URL 路由中使用通配符怎么办? app.get("anything","*") { request in
return "Matches anything after /anything"
}
像这个例子因为用了
Request每个路由的闭包都会有一个
路由参数Vapor 提倡使用类型安全的路由参数来接收数据,我们可以在路由方法中使用 Swift 类型来指定参数类型,Vapor 会在内部解析并将参数返回给闭包以供使用,非常方便。 drop.get("users",Int.self) { request,userId in return "You requested User #(userId)" }
Swift 中处处有协议,路由参数也是如此,我们所见例子中的 public protocol StringInitializable {
init?(from string: String) throws
}
Response每个路由的闭包中可以返回三种类型的内容, Response
// 重定向
Response(redirect: "http://vapor.codes")
// JSON
Response(status: .ok,json: JSON(["hello":"world"]))
// String
Response(body: "hello")
ResponseRepresentable
throw另外一大特性就是可以直接在路由中抛出异常,我们可以 throw 任何遵从 drop.get("404") { request in
throw Abort.notFound
}
当我们请求这个地址的时候一般会看到一个 Vapor 默认提供的错误页面,还挺漂亮的,如果不想用 Vapor 提供的默认错误页面,我们可以从 Abort 枚举在 Vapor 中定义如下: public enum Abort: Swift.Error {
case badRequest
case notFound
case serverError
case custom(status: Status,message: String)
}
Status 枚举了几十个我们可能用到的 HTTP 状态码,如 200( 路由组Vapor 提供了路由组的概念,通常用来集中组织一组相同前缀,添加中间件,限制主机名,或者集中管理的路由,路由组有两个类型: Group 通过一个闭包来收纳旗下所有的路由,让它们有统一的路径前缀,示例如下: drop.group("v1") { v1 in v1.get("users") { request in // get the users } }
Grouped 原理类似,只是形式上有所变化,通过 let v1 = drop.grouped("v1")
v1.get("users") { request in
// get the users
}
文章到此关于 Vapor 路由基本的内容也差不多都介绍完毕了,当然这里讲的可能并不全面,示例代码基本来自于官方文档(感谢 ??),下一篇准备说说 Vapor 的模版引擎 Leaf。 之前开的坑在写一个博客程序 NSPress,如果大家有兴趣欢迎讨论。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |