Alamofire 的自定义、基于内容的验证器(在 Swift 中)

Posted

技术标签:

【中文标题】Alamofire 的自定义、基于内容的验证器(在 Swift 中)【英文标题】:Custom, content based validator for Alamofire (in Swift) 【发布时间】:2016-01-28 17:18:50 【问题描述】:

我知道您可以添加状态代码和内容类型验证器,但我真的很想能够根据结果内容编写自己的验证器 - 基本上我想确保我返回的 json 包含一些字段,并且它们的值是有效的。

我正在开发的应用程序目前的设计方式是有一个服务器类来处理所有 api 调用,并将响应对象返回给调用它的人,这样他们就可以执行逻辑/更新 ui 等。

现在我对所有请求都有一个状态码验证器,所以我不需要在所有外部都有它,但我有几个需要自定义验证逻辑的 api,这意味着我必须将它全部添加调用它的地方,而且我不能使用这种惊人的语法:

switch resp.result 
    case .Success(let value):
        print("yay")
    case .Failure:
        print("nay")


我喜欢任何可以帮助我找到解决方案的答案/指针, 提前非常感谢大家! :)

【问题讨论】:

【参考方案1】:

我最终遇到了同样的问题,发现您想要做的是编写自己的响应序列化程序并停止使用 .validate()。

我使用的序列化器非常非常接近开箱即用的 JSONResponseSerializer,除了我检查了错误。

我对 stock 序列化程序所做的唯一更改是在 do-catch 语句中:

do 
    let JSON = try NSJSONSerialization.JSONObjectWithData(validData, options: options)
    if let responseDict = JSON as? NSDictionary, apiError = NSError.APIErrorFromResponse(responseDict) 
        return .Failure(apiError)
    
    return .Success(JSON)
 catch 
    return .Failure(error as NSError)

APIErrorFromResponse 只是 NSError 上的一个扩展方法,它检查 JSON 中的错误字典并从中填充自定义 NSError

如果您还没有找到解决方案,希望这会为您指明正确的方向!

【讨论】:

我在哪里可以找到开箱即用的 JSONResponseSerializer 的源代码以查看完整的实现? github.com/Alamofire/Alamofire/blob/master/Source/… 在该文件中查找 // MARK: - JSON,您将看到 Alamofire 的默认 JSON 序列化。除了您在此处看到的更改外,我的几乎完全相同。扩展 Request 后,您还需要扩展 DataRequest 以定义使用新序列化函数的方法,就像他们为 JSON 序列化所做的那样。

以上是关于Alamofire 的自定义、基于内容的验证器(在 Swift 中)的主要内容,如果未能解决你的问题,请参考以下文章

swift Alamofire 3的自定义ResponseSerializer

使用 IdentityServer 与创建基于 JWT 的自定义身份验证

带有来自模型的自定义验证消息的 Django 1.5 基于类的视图

表单元素上的自定义引导验证

针对多个 CA 的 Alamofire 5 自定义 SSL 验证

Kong API 网关中的自定义身份验证服务