11
22import Alamofire
33import Foundation
4- import Unbox
54
6- public struct RequestDetails {
5+ public struct RequestDetails : URLRequestConvertible {
76 public let method : HTTPMethod
87 public let url : URL
98 public let parameters : [ String : Any ] ?
@@ -13,18 +12,20 @@ public struct RequestDetails {
1312 self . url = url
1413 self . parameters = parameters
1514 }
15+
16+ public func asURLRequest( ) throws -> URLRequest {
17+ var request = URLRequest ( url: self . url)
18+ request. httpMethod = self . method. rawValue
19+
20+ return try URLEncoding . methodDependent. encode ( request, with: self . parameters)
21+ }
1622}
1723
1824public protocol NetworkRequest : URLRequestConvertible {
19- associatedtype ResponseType : Unboxable
20-
2125 var method : HTTPMethod { get }
2226 var url : URL { get }
2327 var parameters : [ String : Any ] ? { get }
24-
25- func responseDecoded( _ response: ResponseType )
2628}
27-
2829public extension NetworkRequest {
2930 public func getRequestDetails( ) -> RequestDetails {
3031 return RequestDetails (
@@ -35,11 +36,7 @@ public extension NetworkRequest {
3536 }
3637
3738 public func asURLRequest( ) throws -> URLRequest {
38- let requestDetails = self . getRequestDetails ( )
39- var request = URLRequest ( url: requestDetails. url)
40- request. httpMethod = requestDetails. method. rawValue
41-
42- return try URLEncoding . methodDependent. encode ( request, with: requestDetails. parameters)
39+ return try self . getRequestDetails ( ) . asURLRequest ( )
4340 }
4441
4542 public func complete< R, T> ( error: Error , response: DataResponse < R > ? , completionHandler: ( DataResponse < T > ) -> Void ) {
@@ -53,6 +50,28 @@ public extension NetworkRequest {
5350 completionHandler ( successResponse)
5451 }
5552
53+ // MARK: Data
54+
55+ @discardableResult
56+ public func responseData( completionHandler: @escaping ( ( DataResponse < Data > ) -> Void ) ) -> DataRequest {
57+ return Alamofire . request ( self ) . responseData ( completionHandler: { response in
58+ switch response. result {
59+ case . failure( let error) :
60+ if let error = error as? URLError {
61+ if error. code == URLError . cancelled {
62+ return
63+ }
64+ }
65+ default :
66+ break
67+ }
68+
69+ completionHandler ( response)
70+ } )
71+ }
72+
73+ // MARK: JSON
74+
5675 @discardableResult
5776 public func responseJSON( completionHandler: @escaping ( ( DataResponse < Any > ) -> Void ) ) -> DataRequest {
5877 return Alamofire . request ( self ) . responseJSON { response in
@@ -74,34 +93,4 @@ public extension NetworkRequest {
7493
7594 completionHandler ( response)
7695 }
77-
78- @discardableResult
79- public func responseObject( completionHandler: @escaping ( ( DataResponse < ResponseType > ) -> Void ) ) -> DataRequest {
80- return self . responseJSON { response in
81- self . processObjectResponse ( response: response, completionHandler: completionHandler)
82- }
83- }
84- public func processObjectResponse( response: DataResponse < Any > , completionHandler: @escaping ( ( DataResponse < ResponseType > ) -> Void ) ) {
85- switch response. result {
86- case . failure( let error) :
87- self . complete ( error: error, response: response, completionHandler: completionHandler)
88- case . success( let value) :
89- guard let value = value as? [ String : Any ] else {
90- let error = ResponseError . invalidResponse
91- self . complete ( error: error, response: response, completionHandler: completionHandler)
92- return
93- }
94-
95- do {
96- let object : ResponseType = try unbox ( dictionary: value)
97- self . responseDecoded ( object)
98- self . complete ( object: object, response: response, completionHandler: completionHandler)
99- } catch let unboxError as UnboxError {
100- self . complete ( error: unboxError, response: response, completionHandler: completionHandler)
101- } catch {
102- let error = ResponseError . invalidResponse
103- self . complete ( error: error, response: response, completionHandler: completionHandler)
104- }
105- }
106- }
10796}
0 commit comments