Vapor文檔學習十五:ROUTING - Route Parameters

傳統(tǒng)的Web框架通常都是使用字符串作為路由參數(shù)名稱和參數(shù)類型西采,這就為路由出錯埋下了隱患美尸。 Vapor利用Swift閉包捣染,提供了更加安全骄瓣、更加直觀的訪問路由參數(shù)的方法。

Type Safe

創(chuàng)建一個類型安全的路由耍攘,只需要使用Type來替換路徑中的一部分:

drop.get("users", Int.self) { request, userId in
    return "You requested User #\(userId)"
}

上面創(chuàng)建了一個匹配users/:id的路由榕栏,:idInt類型下面。作為對比少漆,下面來演示如何手動判斷路由參數(shù)的寫法:

drop.get("users", ":id") { request in
  guard let userId = request.parameters["id"]?.int else {
    throw Abort.badRequest
  }

  return "You requested User #\(userId)"
}

我們看到類型安全的路由不僅少了3行代碼臼膏,還可以避免發(fā)生運行時的錯誤(比如:id拼寫錯誤)硼被。

String Initializable

所有遵守StringInitializable協(xié)議的類型都可以作為類型安全路由的參數(shù)示损,默認包含以下類型:

  • String
  • Int
  • Model

String是最常用的,并且總是可以匹配的嚷硫。Int只會匹配可以轉(zhuǎn)換為整數(shù)的字符串检访,Model只會匹配通過字符串標識可以在數(shù)據(jù)庫查到的模型。
之前的示例可以更加簡化:

drop.get("users", User.self) { request, user in
  return "You requested \(user.name)"
}

這里提供的標識符會被用于自動查找用戶仔掸。比如請求了/users/5脆贵,User模型會自動查找標識為5的user,如果查找到了則請求成功起暮,并且執(zhí)行閉包卖氨,否則會拋出為查找到用戶的異常。

下面是model沒有遵守StringInitializable協(xié)議的情況下的寫法:

drop.get("users", Int.self) { request, userId in
  guard let user = try User.find(userId) else {
    throw Abort.notFound
  }

    return "You requested User #\(userId)"
}

類型安全的路由總共可以為每一個路由減少6行代碼负懦。

Protocol

自定義類型遵守StringInitializable十分簡單:

// StringInitializable的定義
public protocol StringInitializable {
    init?(from string: String) throws
}

Model類實現(xiàn)協(xié)議方法:

extension Model {
    public init?(from string: String) throws {
        if let model = try Self.find(string) {
            self = model
        } else {
            return nil
        }
    }
}

init既可以返回nil筒捺,也可以拋出異常。這樣你可以拋出自定義的異常纸厉,也可以通過返回nil使用默認的方法處理異常系吭。

Limits

目前類型安全的路由限制只能有三個參數(shù),可以通過使用group來解決這個問題颗品。

drop.group("v1", "users") { users in
  users.get(User.self, "posts", Post.self) { request, user, post in
    return "Requested \(post.name) for \(user.name)"
  }
}

上面是處理/v1/users/:userId/posts/:postId路由請求的結(jié)果肯尺。如果你呼吁增加更多類型安全路由,我們可以考慮將限制數(shù)提高一些躯枢。

Manual

綜上所述则吟,你依然可以使用傳統(tǒng)的路由(非類型安全的路由)來處理特別復雜的情況。

drop.get("v1", "users", ":userId", "posts", ":postId", "comments", ":commentId") { request in
  let userId = try request.parameters.extract("userId") as Int
  let postId = try request.parameters.extract("postId") as Int
  let commentId = try request.parameters.extract("commentId") as Int

  return "You requested comment #\(commentId) for post #\(postId) for user #\(userId)"
}

request.parameters屬性用來提取URI path編碼的參數(shù)(比如/v1/users/1具有參數(shù):userId锄蹂,等于"1")氓仲。參數(shù)作為查詢的一部分進行傳遞的情況下(e.g. /v1/search-user?userId=1),應該使用request.data(e.g. let userId = request.data["userId"]?.string)。

除了返回可選值外寨昙,請求參數(shù)可以作為字典來訪問讥巡,也可以使用extract語法訪問。

Groups

手動使用參數(shù)也適用于group

let userGroup = drop.grouped("users", ":userId")
userGroup.get("messages") { req in
    let user = try req.parameters.extract("userId") as User
}

<b>總結(jié):</b>本章主要介紹了路由參數(shù)設置的方法舔哪,類型安全的路由可以極大的簡化我們的代碼欢顷,但是具有最多3個參數(shù)的限制。通過使用group可以解決這個問題捉蚤。處理復雜的情況下抬驴,我們依然可以使用普通的路由模式。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缆巧,一起剝皮案震驚了整個濱河市布持,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陕悬,老刑警劉巖题暖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捉超,居然都是意外死亡胧卤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門拼岳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枝誊,“玉大人,你說我怎么就攤上這事惜纸∫度觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵耐版,是天一觀的道長祠够。 經(jīng)常有香客問我,道長椭更,這世上最難降的妖魔是什么哪审? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮虑瀑,結(jié)果婚禮上湿滓,老公的妹妹穿的比我還像新娘。我一直安慰自己舌狗,他們只是感情好叽奥,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痛侍,像睡著了一般朝氓。 火紅的嫁衣襯著肌膚如雪魔市。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天赵哲,我揣著相機與錄音待德,去河邊找鬼。 笑死枫夺,一個胖子當著我的面吹牛将宪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橡庞,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼较坛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扒最?” 一聲冷哼從身側(cè)響起丑勤,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吧趣,沒想到半個月后法竞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡再菊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年爪喘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纠拔。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泛豪,靈堂內(nèi)的尸體忽然破棺而出稠诲,到底是詐尸還是另有隱情,我是刑警寧澤诡曙,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布臀叙,位于F島的核電站,受9級特大地震影響价卤,放射性物質(zhì)發(fā)生泄漏劝萤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一慎璧、第九天 我趴在偏房一處隱蔽的房頂上張望床嫌。 院中可真熱鬧,春花似錦胸私、人聲如沸厌处。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阔涉。三九已至饶辙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間担败,已是汗流浹背支鸡。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椭住,地道東北人郭毕。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像函荣,于是被迫代替她去往敵國和親显押。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理傻挂,服務發(fā)現(xiàn)乘碑,斷路器,智...
    卡卡羅2017閱讀 134,660評論 18 139
  • iOS網(wǎng)絡架構(gòu)討論梳理整理中金拒。兽肤。。 其實如果沒有APIManager這一層是沒法使用delegate的绪抛,畢竟多個單...
    yhtang閱讀 5,193評論 1 23
  • # 一度蜜v3.0協(xié)議 --- # 交互協(xié)議 [TOC] ## 協(xié)議說明 ### 請求參數(shù) 下表列出了v3.0版協(xié)...
    c5e350bc5b40閱讀 650評論 0 0
  • Routing Parameters 傳統(tǒng)的Web框架通過使用路由參數(shù)名稱和類型的字符串為路由留出錯誤空間资铡。vap...
    曉蜻蜓閱讀 657評論 0 1
  • 運動類別 耐力性 耐力性運動笤休,又稱有氧運動,是運動處方最主要和最基本的運動手段症副。在治療性運動處方和預防性運動處方中...
    夢想不會太遙遠閱讀 489評論 0 0