Created
February 21, 2017 11:44
-
-
Save pedromancheno/7092a9f706a1df71ce2bf64fbd2884a9 to your computer and use it in GitHub Desktop.
Wrapper for URLSession for making HTTP Requests.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
enum Result<T> { | |
case success(T?) | |
case failure(Error) | |
} | |
enum HTTPError: Error { | |
case noResponse | |
case unsuccesfulStatusCode(Int) | |
} | |
typealias HTTPCompletion = ((Result<[String:Any]>) -> Void) | |
struct HTTP { | |
private static var successCodes: Range<Int> = 200..<299 | |
static func execute(request: URLRequest, completion: @escaping HTTPCompletion) { | |
let session = URLSession.shared | |
var task: URLSessionDataTask? | |
debugPrint(request) | |
task = session.dataTask(with: request) { (data: Data?, response:URLResponse?, error:Error?) in | |
guard let error = error else { | |
self.evaluate(data: data, response: response, completion: completion) | |
return | |
} | |
completion(.failure(error)) | |
} | |
task?.resume() | |
} | |
fileprivate static func evaluate(data: Data?, response: URLResponse?, completion: HTTPCompletion) { | |
guard let httpResponse = response as? HTTPURLResponse else { | |
completion(.failure(HTTPError.noResponse)) | |
return | |
} | |
debugPrint(httpResponse) | |
validateStatusCodes(data: data, httpResponse: httpResponse, completion: completion) | |
} | |
fileprivate static func validateStatusCodes(data: Data?, httpResponse: HTTPURLResponse, completion: HTTPCompletion) { | |
guard successCodes.contains(httpResponse.statusCode) else { | |
completion(.failure(HTTPError.unsuccesfulStatusCode(httpResponse.statusCode))) | |
return | |
} | |
makeJSON(data: data, completion: completion) | |
} | |
fileprivate static func makeJSON(data: Data?, completion: HTTPCompletion) { | |
guard let data = data else { | |
completion(.success(nil)) | |
return | |
} | |
let json = dataToJSON(data: data) | |
completion(.success(json)) | |
} | |
fileprivate static func dataToJSON(data: Data) -> [String:Any]? { | |
do { | |
return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any] | |
} catch let jsonError { | |
debugPrint(jsonError) | |
} | |
return nil | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment