Skip to content

Instantly share code, notes, and snippets.

@shiningabdul
Last active November 17, 2017 07:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shiningabdul/77269ec231a71bdd8b69235db3cd5bc4 to your computer and use it in GitHub Desktop.
Save shiningabdul/77269ec231a71bdd8b69235db3cd5bc4 to your computer and use it in GitHub Desktop.
import Foundation
final class APICaller {
private let baseUrl:String = "http://localhost:8080/"
static let sharedInstance = APICaller()
private init() {}
func performCallToEndpoint<T : Transmittable>(_ endpoint:String, using method:String, body:Transmittable?, responseType: T.Type, completion: @escaping (_ error:Error?, _ serverError:ServerError?, _ response:T?) -> Void) {
let request = createURLRequest(toEndpoint: endpoint, using:method, body: body)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard error == nil else {
print(error!)
completion(error, nil, nil)
return
}
if let httpResponse = response as? HTTPURLResponse {
guard httpResponse.statusCode == 200 else {
let serverError = ServerError.decode(from: data);
completion(nil, serverError, nil)
return
}
}
let serverResponse = T.decode(from: data)
completion(nil, nil, serverResponse)
}
task.resume()
}
private func createURLRequest(toEndpoint endpoint:String, using method:String, body:Transmittable?) -> URLRequest {
let url = URL(string: baseUrl + endpoint)!
var request = URLRequest(url: url)
request.httpMethod = method
if let body = body {
request.httpBody = body.encode()
}
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
return request
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment