88
99import Foundation
1010
11- public struct HUNetworkError : Error
12- {
13- let reason : String ?
14- let httpStatusCode : Int ?
15- }
16-
17- public enum HUHttpMethods : String
18- {
19- case get = " GET "
20- case post = " POST "
21- case put = " PUT "
22- case delete = " DELETE "
23- }
24-
25-
2611public struct HttpUtility
2712{
28- private var _token : String ? = nil
29- private var _customJsonDecoder : JSONDecoder ? = nil
30-
31- public init ( token: String ? ) {
32- _token = token
33- }
34-
35- public init ( token: String ? , decoder: JSONDecoder ? ) {
36- _token = token
37- _customJsonDecoder = decoder
38- }
13+ static let shared = HttpUtility ( )
14+ public var authenticationToken : String ? = nil
15+ public var customJsonDecoder : JSONDecoder ? = nil
3916
40- public init ( WithJsonDecoder decoder: JSONDecoder ) {
41- _customJsonDecoder = decoder
42- }
43-
44- public init ( ) { }
17+ private init ( ) { }
4518
4619 public func request< T: Decodable > ( requestUrl: URL , method: HUHttpMethods , requestBody: Data ? = nil , resultType: T . Type , completionHandler: @escaping ( Result < T ? , HUNetworkError > ) -> Void )
4720 {
@@ -68,9 +41,8 @@ public struct HttpUtility
6841 // MARK: - Private functions
6942 private func createJsonDecoder( ) -> JSONDecoder
7043 {
71- let decoder = _customJsonDecoder != nil ? _customJsonDecoder! : JSONDecoder ( )
72- if ( _customJsonDecoder == nil )
73- {
44+ let decoder = customJsonDecoder != nil ? customJsonDecoder! : JSONDecoder ( )
45+ if ( customJsonDecoder == nil ) {
7446 decoder. dateDecodingStrategy = . iso8601
7547 }
7648 return decoder
@@ -79,54 +51,29 @@ public struct HttpUtility
7951 private func createUrlRequest( requestUrl: URL ) -> URLRequest
8052 {
8153 var urlRequest = URLRequest ( url: requestUrl)
82- if ( _token != nil )
83- {
84- urlRequest. addValue ( _token!, forHTTPHeaderField: " authorization " )
54+ if ( authenticationToken != nil ) {
55+ urlRequest. setValue ( authenticationToken!, forHTTPHeaderField: " authorization " )
8556 }
8657
8758 return urlRequest
8859 }
8960
9061 private func decodeJsonResponse< T: Decodable > ( data: Data , responseType: T . Type ) -> T ?
9162 {
92- let decoder = self . createJsonDecoder ( )
63+ let decoder = createJsonDecoder ( )
9364 do {
9465 return try decoder. decode ( responseType, from: data)
9566 } catch let error{
96- debugPrint ( " deocding error => \( error) " )
67+ debugPrint ( " deocding error => \( error. localizedDescription ) " )
9768 }
9869 return nil
9970 }
10071
101- private func performOperation< T: Decodable > ( requestUrl: URLRequest , responseType: T . Type , completionHandler: @escaping ( Result < T ? , HUNetworkError > ) -> Void )
102- {
103- URLSession . shared. dataTask ( with: requestUrl) { ( data, httpUrlResponse, error) in
104-
105- let statusCode = ( httpUrlResponse as? HTTPURLResponse ) ? . statusCode
106- if ( error == nil && data != nil && data? . count != 0 )
107- {
108- let response = self . decodeJsonResponse ( data: data!, responseType: responseType)
109-
110- if ( response != nil ) {
111- completionHandler ( . success( response) )
112- } else {
113- completionHandler ( . failure( HUNetworkError ( reason: " decoding error " , httpStatusCode: statusCode) ) )
114- }
115- }
116- else
117- {
118- let networkError = HUNetworkError ( reason: error. debugDescription, httpStatusCode: statusCode)
119- completionHandler ( . failure( networkError) )
120- }
121-
122- } . resume ( )
123- }
124-
12572 // MARK: - GET Api
12673 private func getData< T: Decodable > ( requestUrl: URL , resultType: T . Type , completionHandler: @escaping ( Result < T ? , HUNetworkError > ) -> Void )
12774 {
12875 var urlRequest = createUrlRequest ( requestUrl: requestUrl)
129- urlRequest. httpMethod = " get "
76+ urlRequest. httpMethod = HUHttpMethods . get. rawValue
13077
13178 performOperation ( requestUrl: urlRequest, responseType: T . self) { ( result) in
13279 completionHandler ( result)
@@ -137,7 +84,7 @@ public struct HttpUtility
13784 private func postData< T: Decodable > ( requestUrl: URL , requestBody: Data , resultType: T . Type , completionHandler: @escaping ( Result < T ? , HUNetworkError > ) -> Void )
13885 {
13986 var urlRequest = createUrlRequest ( requestUrl: requestUrl)
140- urlRequest. httpMethod = " post "
87+ urlRequest. httpMethod = HUHttpMethods . post. rawValue
14188 urlRequest. httpBody = requestBody
14289 urlRequest. addValue ( " application/json " , forHTTPHeaderField: " content-type " )
14390
@@ -150,7 +97,7 @@ public struct HttpUtility
15097 private func putData< T: Decodable > ( requestUrl: URL , resultType: T . Type , completionHandler: @escaping ( Result < T ? , HUNetworkError > ) -> Void )
15198 {
15299 var urlRequest = createUrlRequest ( requestUrl: requestUrl)
153- urlRequest. httpMethod = " put "
100+ urlRequest. httpMethod = HUHttpMethods . put. rawValue
154101
155102 performOperation ( requestUrl: urlRequest, responseType: T . self) { ( result) in
156103 completionHandler ( result)
@@ -161,10 +108,37 @@ public struct HttpUtility
161108 private func deleteData< T: Decodable > ( requestUrl: URL , resultType: T . Type , completionHandler: @escaping ( Result < T ? , HUNetworkError > ) -> Void )
162109 {
163110 var urlRequest = createUrlRequest ( requestUrl: requestUrl)
164- urlRequest. httpMethod = " delete "
111+ urlRequest. httpMethod = HUHttpMethods . delete. rawValue
165112
166113 performOperation ( requestUrl: urlRequest, responseType: T . self) { ( result) in
167114 completionHandler ( result)
168115 }
169116 }
117+
118+ // MARK: - Perform data task
119+ private func performOperation< T: Decodable > ( requestUrl: URLRequest , responseType: T . Type , completionHandler: @escaping ( Result < T ? , HUNetworkError > ) -> Void )
120+ {
121+ URLSession . shared. dataTask ( with: requestUrl) { ( data, httpUrlResponse, error) in
122+
123+ let statusCode = ( httpUrlResponse as? HTTPURLResponse ) ? . statusCode
124+ if ( error == nil && data != nil && data? . count != 0 )
125+ {
126+ let response = decodeJsonResponse ( data: data!, responseType: responseType)
127+
128+ if ( response != nil ) {
129+ completionHandler ( . success( response) )
130+ } else {
131+
132+ let responseJsonString = String ( data: data!, encoding: . utf8)
133+ completionHandler ( . failure( HUNetworkError ( reason: " response decoding error = \( String ( describing: responseJsonString) ) " , httpStatusCode: statusCode) ) )
134+ }
135+ }
136+ else
137+ {
138+ let networkError = HUNetworkError ( reason: error. debugDescription, httpStatusCode: statusCode)
139+ completionHandler ( . failure( networkError) )
140+ }
141+
142+ } . resume ( )
143+ }
170144}
0 commit comments