基于Swift的Web框架Vapor2.0文檔(翻譯)Validation-Overview

轉(zhuǎn)載請(qǐng)附原文鏈接:http://blog.fandong.me/2017/08/22/iOS-SwiftVaporWeb30/

前言

之前一直有做Java后臺(tái)開(kāi)發(fā)的興趣,可是想到要看好多的Java教程,作為一個(gè)iOS開(kāi)發(fā)者,我放棄了,
后來(lái)從朋友韓云智VL那里知道了這個(gè)框架,竟是用Swift寫(xiě)的,不得不說(shuō),它燃起了我的興趣。
Vapor是一個(gè)基于Swift開(kāi)發(fā)的服務(wù)端框架,可以工作于iOS,Mac OS,Ubuntu。
為了配合Swift部署到服務(wù)器,我把ECS的服務(wù)器系統(tǒng)改為Ubuntu16.04。

Vapor 2.0 - 文檔目錄
以下文字翻譯自Vapor Docs/Validation/Overview
警告
本章節(jié)可能包含過(guò)時(shí)的內(nèi)容

驗(yàn)證

Vapor提供了幾種不同的方法來(lái)驗(yàn)證進(jìn)入應(yīng)用程序的數(shù)據(jù),讓我們從最常見(jiàn)的開(kāi)始.

常見(jiàn)用法

默認(rèn)情況下包含幾個(gè)方便有效的驗(yàn)證器,您可以使用這些來(lái)驗(yàn)證進(jìn)入應(yīng)用程序的數(shù)據(jù),或?qū)⑺麄兘M合起來(lái)并且創(chuàng)建自己的數(shù)據(jù).
我們來(lái)看看最常用的驗(yàn)證數(shù)據(jù)的方法

class Employee {
    var email: Valid<Email>
    var name: Valid<Name>

    init(request: Request) throws {
        name = try request.data["name"].validated()
        email = try request.data["email"].validated()
    }
}

在這里,我們有一個(gè)典型的成員模型emailname,通過(guò)聲明這兩個(gè)屬性Valid<>,您確保這些屬性只能包含有效的數(shù)據(jù),Swift類型檢查系統(tǒng)將放置任何不通過(guò)驗(yàn)證的內(nèi)容被存儲(chǔ).
要在某個(gè)Valid<>屬性中存儲(chǔ)某些東西,您必須使用.validate的()方法,這可用于request.data返回的任何數(shù)據(jù).
Email是一個(gè)包含在Vapor中真正的validator,但是Name不是,我們來(lái)看看如何創(chuàng)建一個(gè)驗(yàn)證器.

Valid<OnlyAlphanumeric>
Valid<Email>
Valid<Unique<T>>
Valid<Matches<T>>
Valid<In<T>>
Valid<Contains<T>>
Valid<Count<T>>

驗(yàn)證器和驗(yàn)證套件

驗(yàn)證器,像Count或者Contains可以有多個(gè)配置,例如:

let name: Valid<Count<String>> = try "Vapor".validated(by: Count.max(5))

這里我們驗(yàn)證的字符串String最多是5個(gè)字符長(zhǎng),Valid<Count>類型告訴我們,被驗(yàn)證的字符串是一定的數(shù)量,但是他并沒(méi)有告訴到底這個(gè)數(shù)量是多少,被驗(yàn)證的字符串是小于三個(gè)字符或者超過(guò)一百萬(wàn)個(gè)字符.
因此,驗(yàn)證器他們并不想一些應(yīng)用程序所希望的那樣安全,但是驗(yàn)證套件(ValidationSuites)解決了這個(gè)問(wèn)題,他們將多個(gè)驗(yàn)證器和驗(yàn)證套件組合在一起表示何種類型的數(shù)據(jù)應(yīng)被視為是有效的.

自定義驗(yàn)證器

以下是如何創(chuàng)建自定義ValidationSuite.

class Name: ValidationSuite {
    static func validate(input value: String) throws {
        let evaluation = OnlyAlphanumeric.self
            && Count.min(5)
            && Count.max(20)

        try evaluation.validate(input: value)
    }
}

你只需要實(shí)現(xiàn)一種方法,在這個(gè)方法中,使用其他驗(yàn)證器或邏輯來(lái)創(chuàng)建自定義驗(yàn)證器,這里我們定義一個(gè)Name只接受5到20個(gè)字母數(shù)字字符串.
現(xiàn)在我們可以確定任何Valid<Name>類型的內(nèi)容遵循這些規(guī)則.

組合驗(yàn)證器

Name驗(yàn)證器中,你可以看到&&被用來(lái)組合驗(yàn)證器,您可以使用&&以及||來(lái)將任意驗(yàn)證器組合起來(lái),正如你使用if語(yǔ)句和布爾值一樣使用.
你也可以使用!來(lái)反轉(zhuǎn)驗(yàn)證器.

let symbols = input.validated(by: !OnlyAlphanumeric.self)

驗(yàn)證測(cè)試

雖然validated() throw是最常用的驗(yàn)證方法,但還有另外兩種.

let passed = input.passes(Count.min(5))
let valid = try input.tested(Count.min(5))

passes()會(huì)返回一個(gè)布爾值來(lái)表示是否通過(guò)驗(yàn)證測(cè)試,如果沒(méi)有用過(guò)驗(yàn)證,tested()將會(huì)拋出異常,但是不像validated()會(huì)返回Valid<>類型,tested()將會(huì)返回所調(diào)用項(xiàng)目的原始類型.

驗(yàn)證失敗

Vapor的驗(yàn)證中間件會(huì)自動(dòng)捕獲驗(yàn)證失敗,但是你可以自己捕獲或者對(duì)于某些特定失敗類型自定義響應(yīng).

do {
    //validation here
} catch let error as ValidationErrorProtocol {
    print(error.message)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2017年6月17日 星期六 晴 一如既往的大晴天,一如既往的大旱!啥時(shí)候下幾場(chǎng)大雨,緩解一下旱情?。? ...
    李墨兒媽媽閱讀 178評(píng)論 0 0
  • Chapter2 藥療不如食療 (整理 by Weijing) 如何藥療?八個(gè)字:什么都吃,適可而止,七八分飽,營(yíng)...
    E2E2E閱讀 254評(píng)論 0 0
  • 他愛(ài)的是風(fēng)花雪月 而你愛(ài)的是他 他留戀于萬(wàn)千花叢 而你獨(dú)為他綻放 他穿梭于高山峻嶺 而你只做一株腳下草 他捕捉的是...
    劉若雅閱讀 432評(píng)論 2 1

友情鏈接更多精彩內(nèi)容