Swift后端Vapor中的数据校验

Validation

亲,我的简书已不再维护和更新了,所有文章都迁移到了我的个人博客:https://mikefighting.github.io/,欢迎交流。

服务端在有数据请求时需要对数据进行校验然后返回响应的校验结果,比如要求必须输入邮箱,必须输入电话等,Validation工具给我们提供了非常方便的常用操作,接下来就对其使用过程做以总结(本文用到的是Validation 1.2.0版本)。

Vapor中添加Validation依赖包

Package.swift文件中添加如下的依赖,比如:

.Package(url: "https://github.com/vapor/vapor.git", majorVersion: 2),
.Package(url: "https://github.com/vapor/validation-provider.git", majorVersion: 1)

之后要执行vapor clean或者rm -rf .build Package.pins,然后执行vapor update或者swift package update,这样才可以安装好依赖。

校验实例

Alphanumeric校验

接下来我们来做一个简单的校验,校验输入的字符串是否是a-z或者0-9在请求中加入如下代码:

   get("alpha") { request in
               guard let input = request.data["input"]?.string else {
                   throw Abort.badRequest
               }
               let validInput = try input.tested(by: OnlyAlphanumeric())
               return "validated:\\(validInput)"
   }

我们运行程序,然后在PostMan中输入http://localhost:8080/alpha?input=example@github.com,这时会得到下面的返回值:

    {"identifier":"Validation.ValidatorError.failure","reason":"Internal Server Error","debugReason":"OnlyAlphanumeric failed validation: example@github.com is not alphanumeric","error":true}

这也就说明了,我们传输的问本内容不符合alphanumeric
然后我们将URL改为http://localhost:8080/alpha?input=example123,然后就会看到我们的返回值

validated:example

邮箱校验

我们可以利用EmailValidator来做邮箱的校验,方法同上面一样:

get("email") { request in
            guard let input = request.data["input"]?.string else {
                throw Abort.badRequest
            }
            let validaInput = try input.tested(by: EmailValidator())
            return "validated:\\(validaInput)"
    }     

然后我们输入URL:http://localhost:8080/email?input=wallaceicdi@outlook.com,然后就会的到:

Validated: wallaceicdi@outlook.com

其余自带校验工具

校验类 功能 用法
Unique 输入内容是否唯一 someCharacter.tested(by: Unique())
Compare 输入内容的数值比较 int.tested(by:Compare.greaterThan(1))
Contains 输入的内容是否包含某个 someArray.tested(by: Contains("1"))
Count 输入的内容个数 someArray.tested(by: Count.max(2))
Equals 输入的内容是否相同 someConent.tested(by: Equals.init("equal"))
In 输入内容是否被包含 input.tested(by: In.init(["1","2","3"]))

创建自己的校验工具

通过参考工具自带的Equals.Swift

/// Validates that matches a given input
public struct Equals<T>: Validator where T: Validatable, T: Equatable {
    /// The value expected to be in sequence
    public let expectation: T

    /// Initialize a validator with the expected value
    public init(_ expectation: T) {
        self.expectation = expectation
    }

    public func validate(_ input: T) throws {
        guard input == expectation else {
            throw error("\\(input) does not equal expectation \\(expectation)")
        }
    }
}

从这里面我们可以看出,只要遵守Validator协议,并且实现其validate方法即可。

参考文件:
https://github.com/vapor/validation/blob/master/Tests/ValidationTests/ValidationConvenienceTests.swift

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,601评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,029评论 4 62
  • 职场上总有些人,正经事不干,整天就知道搬弄是非,乱嚼舌根。俗话说,没有不透风的墙,鸡蛋再密也有缝!别背后说领导或同...
    neojos阅读 689评论 0 0
  • 42原文墙有茨 墙有茨,不可扫也。中冓之言,不可道也。所可道也,言之丑也。 墙有茨,不可襄也。中冓之言,不可详也。...
    逗霸君阅读 336评论 7 3