使用Alamofirie请求接受多个状态码范围

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

标签: swift alamofire

我想接受经典状态代码范围(2XX)以及一些额外的错误状态代码。那么,我如何使用Alamofire Request的验证方法呢?

类似的东西:

Alamofire.request(self)
    .validate(statusCode: [ 200..<300 , 403 ])
    .responseJSON { response in
        switch response.result {
            case .Success(let JSON):
                ...
            case .Failure(let error):
                ...
            }
    })

1 个答案:

答案 0 :(得分:1)

Alamofire接受带有可接受代码的Range<Int>参数。范围要求所有元素都是连续的,因此您必须编写自己的验证器代码。这应该有效:

.validate { _, response in
    let acceptableStatusCodes: [Range<Int>] = [200..<300, 403...403]
    if acceptableStatusCodes.map({$0.contains(response.statusCode)}).reduce(false, combine: {$0 || $1}) {
        return .Success
    } else {
        let failureReason = "Response status code was unacceptable: \(response.statusCode)"
        return .Failure(Error.errorWithCode(.StatusCodeValidationFailed, failureReason: failureReason))
    }
}

您还可以在Request扩展名中声明它以获得更好的代码重用性:

extension Request {
    func validateStatusCode() -> Request {
        return self.validate { _, response in
            let acceptableStatusCodes: [Range<Int>] = [200..<300, 403...403]
            if acceptableStatusCodes.map({$0.contains(response.statusCode)}).reduce(false, combine: {$0 || $1}) {
                return .Success
            } else {
                let failureReason = "Response status code was unacceptable: \(response.statusCode)"
                return .Failure(Error.errorWithCode(.StatusCodeValidationFailed, failureReason: failureReason))
            }
        }
    }
}

并称之为:

Alamofire.request(self)
    .validateStatusCode()
    .responseJSON { response in
        switch response.result {
            case .Success(let JSON):
                ...
            case .Failure(let error):
                ...
            }
    })