使用Alamofire验证JSON响应

时间:2016-06-15 15:03:20

标签: ios json swift alamofire

是否可以使用Alamofire验证程序获取解析的JSON响应,检查属性并根据该值返回true / false?

我有一个始终返回200个响应代码的API,但响应具有成功属性。

我想在触发responseJSON回调之前检查此属性,如果success == true则只调用responseJSON。

这可以使用自定义验证器吗?

2 个答案:

答案 0 :(得分:3)

找到一个我感觉很好的解决方案。首先,我创建了扩展方法来检查错误并提取我感兴趣的数据。我有一个成功的回调和一个错误回调。

import Foundation
import Alamofire

extension Request {
    public func apiSuccess(
            queue queue: dispatch_queue_t? = nil,
            options: NSJSONReadingOptions = .AllowFragments,
            completionHandler: [String:AnyObject] -> Void)
                    -> Self
    {
        return response(
        queue: queue,
                responseSerializer: Request.JSONResponseSerializer(options: options),
                completionHandler: { response in
                    if let jsonValue = response.result.value as? [String:AnyObject] {
                       let success = jsonValue["success"] as! Bool
                        if (success) {
                            completionHandler(jsonValue["object"] as! [String:AnyObject])
                        }
                    }
                }
        )
    }

    public func apiError(
        queue queue: dispatch_queue_t? = nil,
              options: NSJSONReadingOptions = .AllowFragments,
              completionHandler: [String] -> Void)
        -> Self
    {
        return response(
            queue: queue,
            responseSerializer: Request.JSONResponseSerializer(options: options),
            completionHandler: { response in
                if let jsonValue = response.result.value as? [String:AnyObject] {
                    let success = jsonValue["success"] as! Bool
                    if (!success) {
                        let errorDict = jsonValue["errors"] as! [String:[String]]
                        var errors : [String] = []
                        errorDict.keys.forEach { key in
                            errors += errorDict[key] as [String]!
                        }

                        completionHandler(errors)
                    }
                }
            }
        )
    }
}

然后我可以像这样使用它:

Alamofire.request(.POST, url,
            parameters: parameters,
            encoding: .JSON)
            .apiSuccess { response in
                print("Success Callback", response)
            }
            .apiError { errors in
                print("Errors ", errors)
        }

答案 1 :(得分:0)

我不这么认为。验证器块不接收响应数据作为参数,只接收标题等。