Skip to content

Instantly share code, notes, and snippets.

@psobko
Created December 14, 2017 19:34
Show Gist options
  • Save psobko/75dc40f2ed9ade24f28e5a9a13b971c4 to your computer and use it in GitHub Desktop.
Save psobko/75dc40f2ed9ade24f28e5a9a13b971c4 to your computer and use it in GitHub Desktop.
Basic Swift HTTP client
import Foundation
class HTTPClient: NSObject {
let logging = true
let session = URLSession.shared
func makeRequest(request: URLRequest, completionHandler: @escaping ([String:AnyObject]?, URLResponse?, Error?) -> Void) {
logRequest(request: request)
let startTime = Date()
session.dataTask(with: request as URLRequest) { (data: Data?, response: URLResponse?, error: Error?) -> Void in
self.logResponse(response: response, timeInterval: Date().timeIntervalSince(startTime))
guard let d = data else { completionHandler(nil, response, error); return }
do {
let json = try JSONSerialization.jsonObject(with: d, options: .allowFragments) as! [String:AnyObject]
completionHandler(json, response, error)
} catch let e as NSError {
completionHandler(nil, response, e)
}
}.resume()
}
func getJSON(path: String, completionHandler: @escaping ([String:AnyObject]?, URLResponse?, Error?) -> Void) {
var request = URLRequest(url: URL(string: path)!)
request.httpMethod = "GET"
request.addValue("HTTPClient 1.0", forHTTPHeaderField: "User-Agent")
makeRequest(request: request) { (data: [String:AnyObject]?, response: URLResponse?, error: Error?) -> Void in
completionHandler(data, response, error)
}
}
func logRequest(request: URLRequest) {
if logging {
print("\(request.httpMethod!) '\(request.url!)'")
}
}
func logResponse(response: URLResponse?, timeInterval: TimeInterval) {
if logging {
if let response = response as? HTTPURLResponse {
print("\(response.statusCode) '\(response.url!)' \(NSString(format: "[%0.4f s]", timeInterval))")
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment