前言
上一篇我們初步了解了Droplet和Route,本篇中我們一起寫(xiě)一些簡(jiǎn)單的get和post請(qǐng)求部念,以及我總結(jié)的一些套路弃酌。因?yàn)楸救艘彩浅鯇W(xué),沒(méi)有任何后端開(kāi)發(fā)經(jīng)驗(yàn)儡炼,所有難免出現(xiàn)錯(cuò)誤妓湘,大蝦們多多指正。
常見(jiàn)請(qǐng)求
get/post請(qǐng)求
返回字符串
drop.get("get","string") { req in
return "Hello, world!"
}
返回JSON
drop.get("get","json") { req in
var json = JSON()
try json.set("hello", "world")
return json
}
獲取request中數(shù)據(jù)
drop.get("get","info") { req in
var json = JSON()
let name = req.data["name"]?.string
let age = req.data["age"]?.int
let isVip = req.data["isVip"]?.bool
try json.set("name", name)
try json.set("age", age)
try json.set("isVip", isVip)
return json
}
post請(qǐng)求同上處理乌询。
項(xiàng)目路由處理常見(jiàn)套路
單一文件
demo或者測(cè)試項(xiàng)目中業(yè)務(wù)邏輯很少榜贴,不需要統(tǒng)一管理時(shí),所有的路由直接寫(xiě)main.swift
中就可以了楣责。
如: main.swift
let config = try Config()
try config.setup()
let drop = try Droplet(config)
// 注冊(cè)路由
// get 示例
drop.get("welcome") { request in
return "Hello"
}
// post 示例
drop.post("form") { request in
return "Submitted with a POST request"
}
// 路由組 示例 1
drop.group("v1") { v1 in
// get
v1.get("users") { request in
// get the users
}
// post
drop.post("form") { request in
return "Submitted with a POST request"
}
}
// 路由組 示例 2
let v1 = drop.grouped("v1")
// get
v1.get("users") { request in
// get the users
}
// post
v1.post("form") { request in
return "Submitted with a POST request"
}
// 運(yùn)行
try drop.run()
vapor模板中的實(shí)現(xiàn)
當(dāng)直接使用vapor new Hello --template=api
創(chuàng)建一個(gè)名為“hello”的vapor默認(rèn)的模板項(xiàng)目時(shí)竣灌,內(nèi)部已經(jīng)存在了部分樣板代碼聂沙。
具體就是通過(guò)給Config
、Droplet
添加extension初嘹,在extension中實(shí)現(xiàn)路由注冊(cè)及汉。具體代碼參考Sources/App/Setup/
目錄下Config+Setup.swift
和Droplet+Setup.swift
文件。
在Droplet+Setup.swift
實(shí)現(xiàn)一個(gè)setup
方法去注冊(cè)路由
extension Droplet {
public func setup() throws {
try setupRoutes()
// Do any additional droplet setup
}
func setupRoutes() throws {
get("hello") { req in
var json = JSON()
try json.set("hello", "world")
return json
}
post("posttest") { req in
}
}
}
工具類(lèi)統(tǒng)一注冊(cè)路由
通過(guò)一個(gè)工具類(lèi)如:RouteTool屯烦、Router 等等(命名隨意)坷随,來(lái)統(tǒng)一注冊(cè)路由,以MVC的方式搭建項(xiàng)目驻龟。
首先在main.swift
中温眉,我們定義全局變量api
、v1
翁狐、v2
等(根據(jù)實(shí)際需求)管理路由組类溢。如:
let config = try Config()
try config.setup()
let drop = try Droplet(config)
/// 基礎(chǔ)api
let api = drop.grouped("api")
let v1 = api.grouped("v1")
let v2 = api.grouped("v2")
/// 路由
RouteTool.setUp()
try drop.run()
然后如上述代碼中RouteTool.setUp()
,我們創(chuàng)建一個(gè)路由工具RouteTool
露懒,并為其實(shí)現(xiàn)一個(gè)setUp
方法來(lái)為不同的控制器統(tǒng)一注冊(cè)路由闯冷。示例:
struct RouteTool {
static func setUp() {
// 注冊(cè)業(yè)務(wù)
SignController().registeredRouting()
// 用戶(hù)業(yè)務(wù)
UserController().registeredRouting()
// 驗(yàn)證碼
VerifyCodeController().registeredRouting()
// 評(píng)論業(yè)務(wù)
CommentController().registeredRouting()
···等等
}
}
然后我們?cè)诰唧w的控制器里,完成路由注冊(cè)懈词、數(shù)據(jù)請(qǐng)求的具體實(shí)現(xiàn)蛇耀。比如我們創(chuàng)建SignUpController,用來(lái)處理用戶(hù)注冊(cè)的業(yè)務(wù)坎弯。
在SignUpController.swift
中纺涤,我們實(shí)現(xiàn)處理請(qǐng)求。方法內(nèi)部的業(yè)務(wù)代碼此處使用...
省略抠忘,并非本篇重點(diǎn)撩炊。
class SignController {
// 對(duì)外提供統(tǒng)一注冊(cè)路由的方法
public func registeredRouting() {
v1.post("signup", handler: self.signup)
v1.post("password","reset", handler: self.resetPassWord)
v1.post("password","change", handler: self.changePassWord)
}
// 用戶(hù)注冊(cè)
func signup(_ request: Request) throws -> ResponseRepresentable {
...
}
// 重置密碼
func resetPassWord(_ request: Request) throws -> ResponseRepresentable {
...
}
// 更改密碼
func changePassWord(_ request: Request) throws -> ResponseRepresentable {
...
}
...等等其他業(yè)務(wù)
}
通過(guò)RouteCollection協(xié)議來(lái)注冊(cè)路由組
同樣的,我們使用上一節(jié)中的SignController
作代碼示例褐桌。遵守RouteCollection
協(xié)議并實(shí)現(xiàn)func build(_ builder: RouteBuilder)
協(xié)議方法衰抑。
class SignController: RouteCollection {
func build(_ builder: RouteBuilder) throws {
let api = builder.grouped("api")
let v1 = api.grouped("v1")
v1.post("signup", handler: self.signUp)
v1.post("password","reset", handler: self.resetPassWord)
v1.post("password","change", handler: self.changePassWord)
}
// 用戶(hù)注冊(cè)
func signup(_ request: Request) throws -> ResponseRepresentable {
...
}
// 重置密碼
func resetPassWord(_ request: Request) throws -> ResponseRepresentable {
...
}
// 更改密碼
func changePassWord(_ request: Request) throws -> ResponseRepresentable {
...
}
...等等其他業(yè)務(wù)
}
這時(shí)候我們就可以在main.swift
中通過(guò)collection(<#T##c: (EmptyInitializable & RouteCollection).Protocol##(EmptyInitializable & RouteCollection).Protocol#>)
來(lái)注冊(cè)路由組了。
let config = try Config()
try config.setup()
let drop = try Droplet(config)
// 注冊(cè)路由組
let signVC = SignController()
drop.collection(signVC)
try drop.run()
我們也可以為控制器實(shí)現(xiàn)一個(gè)extension并遵守EmptyInitializable
協(xié)議荧嵌,這樣做的目的是注冊(cè)路由時(shí)我們無(wú)需實(shí)例化該控制器呛踊。
extension SignController: EmptyInitializable { }
此時(shí)我們?cè)谝陨献?cè)路由組的示例代碼中就不需要實(shí)例化SignController了。
drop.collection(SignController.self)
最后
本篇是我在閱讀文檔和其他開(kāi)源項(xiàng)目時(shí)總結(jié)的一些小套路啦撮,畢竟我也沒(méi)有后端開(kāi)發(fā)經(jīng)驗(yàn)谭网,文中若出現(xiàn)錯(cuò)誤,歡迎批評(píng)指正赃春。