diff --git a/CHANGELOG.md b/CHANGELOG.md index ba178a87..dcba36fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +### 0.6.5 + +- **Add**: Ability to handle responses with non-default status codes. + ### 0.6.4 - **Fix**: SpinnerView bug(no animation) in Swift 4. diff --git a/LeadKit.podspec b/LeadKit.podspec index 19f7883d..8db51ad6 100644 --- a/LeadKit.podspec +++ b/LeadKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LeadKit" - s.version = "0.6.4" + s.version = "0.6.5" s.summary = "iOS framework with a bunch of tools for rapid development" s.homepage = "https://github.com/TouchInstinct/LeadKit" s.license = "Apache License, Version 2.0" diff --git a/Sources/Classes/Services/NetworkService.swift b/Sources/Classes/Services/NetworkService.swift index ad89b7b8..7811c4e5 100644 --- a/Sources/Classes/Services/NetworkService.swift +++ b/Sources/Classes/Services/NetworkService.swift @@ -37,6 +37,8 @@ open class NetworkService { public let sessionManager: Alamofire.SessionManager + private let acceptableStatusCodes: [Int] + var requestCount: Driver { return requestCountVariable.asDriver() } @@ -44,8 +46,11 @@ open class NetworkService { /// Creates new instance of NetworkService with given Alamofire session manager /// /// - Parameter sessionManager: Alamofire.SessionManager to use for requests - public init(sessionManager: Alamofire.SessionManager) { + public init(sessionManager: Alamofire.SessionManager, + acceptableStatusCodes: [Int] = Alamofire.SessionManager.defaultAcceptableStatusCodes) { + self.sessionManager = sessionManager + self.acceptableStatusCodes = acceptableStatusCodes } /// Perform reactive request to get mapped ObservableMappable model and http response @@ -55,7 +60,8 @@ open class NetworkService { public func rxRequest(with parameters: ApiRequestParameters) -> Observable<(response: HTTPURLResponse, model: T)> where T.ModelType == T { - return sessionManager.rx.responseObservableModel(requestParameters: parameters) + return sessionManager.rx.responseObservableModel(requestParameters: parameters, + acceptableStatusCodes: acceptableStatusCodes) .counterTracking(for: self) } @@ -66,7 +72,8 @@ open class NetworkService { public func rxRequest(with parameters: ApiRequestParameters) -> Observable<(response: HTTPURLResponse, model: T)> { - return sessionManager.rx.responseModel(requestParameters: parameters) + return sessionManager.rx.responseModel(requestParameters: parameters, + acceptableStatusCodes: acceptableStatusCodes) .counterTracking(for: self) } diff --git a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift index d308eef2..9c010ba0 100644 --- a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -25,18 +25,29 @@ import RxSwift import RxAlamofire import ObjectMapper +public extension Alamofire.SessionManager { + + /// The default acceptable range 200...299 + static let defaultAcceptableStatusCodes = Array(200..<300) + +} + public extension Reactive where Base: Alamofire.SessionManager { /// Method which executes request with given api parameters /// /// - Parameter requestParameters: api parameters to pass Alamofire /// - Returns: Observable with request - func apiRequest(requestParameters: ApiRequestParameters) -> Observable { + func apiRequest(requestParameters: ApiRequestParameters, + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) + -> Observable { + return request(requestParameters.method, requestParameters.url, parameters: requestParameters.parameters, encoding: requestParameters.encoding, headers: requestParameters.headers) + .map { $0.validate(statusCode: acceptableStatusCodes) } } /// Method which executes request and serializes response into target object @@ -45,11 +56,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object func responseModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, model: T)> { - return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } /// Method which executes request and serializes response into array of target objects @@ -58,11 +70,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and array of target objects func responseModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, models: [T])> { - return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } /// Method which executes request and serializes response into target object @@ -71,11 +84,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object func responseObservableModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, model: T)> where T.ModelType == T { - return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.observableApiResponse(mappingQueue: mappingQueue) } + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.observableApiResponse(mappingQueue: mappingQueue) } } /// Method which executes request and serializes response into array of target objects @@ -84,11 +98,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and array of target objects func responseObservableModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, models: [T])> where T.ModelType == T { - return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.observableApiResponse(mappingQueue: mappingQueue) } + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.observableApiResponse(mappingQueue: mappingQueue) } } }