Skip to content

Instantly share code, notes, and snippets.

@egcode
Created April 15, 2017 03:37
Show Gist options
  • Save egcode/f37cfe1f936cb516b3791d82b6d97efc to your computer and use it in GitHub Desktop.
Save egcode/f37cfe1f936cb516b3791d82b6d97efc to your computer and use it in GitHub Desktop.
import UIKit
//-------------------------------------------------------------------------------
//MARK: - API
class API {
enum Method:String {
case get = "GET"
case post = "POST"
case put = "PUT"
case delete = "DELETE"
}
typealias Response = (_ code: Int, _ object: Any?) -> Void
class func get(url: String, response: @escaping Response) {
self.request(method: .get, url: url) { (object, code, error) in
response(code, object)
}
}
class func post(url: String, payload: Any, response: @escaping Response) {
self.request(method: .post, url: url, payload: payload) { (object, code, error) in
response(code, object)
}
}
class func put(url: String, response: @escaping Response) {
self.request(method: .put, url: url) { (object, code, error) in
response(code, object)
}
}
class func delete(url: String, response: @escaping Response) {
self.request(method: .delete, url: url) { (object, code, error) in
response(code, object)
}
}
private class func request(method: Method, url: String, payload: Any? = nil, completionHandler: @escaping (Any?, Int, Error?) -> Swift.Void) {
guard let url = URL(string: url) else {
completionHandler(nil, -1, nil)
return
}
var request = URLRequest(url: url)
request.httpMethod = method.rawValue
if let dictPayload = payload as? [String: Any] {
request.httpBody = dictPayload.JSONData
} else if let arrayPayload = payload as? [Any] {
request.httpBody = arrayPayload.JSONData
}
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { (data, response, error) in
var responseObject: Any? = nil
if let responseData = data {
if let obj = responseData.JSONObject {
responseObject = obj
} else if let image = UIImage(data: responseData) {
responseObject = image
}
}
DispatchQueue.main.async {
completionHandler(responseObject, (response as? HTTPURLResponse)?.statusCode ?? -1, error)
}
}
task.resume()
}
}
//-------------------------------------------------------------------------------
//MARK: - JSON
extension Data {
var JSONObject: Any? {
do {
return try JSONSerialization.jsonObject(with: self, options: [])
} catch {
//print("Problem de-serializing object: \(error)")
}
return nil
}
}
extension String {
var JSONObject: Any? {
guard let data = self.data(using: .utf8) else {
return nil
}
return data.JSONObject
}
}
extension Dictionary {
var JSONString: String? {
guard let data = self.JSONData else {
return nil
}
return String(data: data, encoding: String.Encoding.utf8)
}
var JSONData: Data? {
do {
return try JSONSerialization.data(withJSONObject: self, options: [])
} catch {
//print("Problem de-serializing object: \(error)")
}
return nil
}
}
extension Array {
var JSONString: String? {
guard let data = self.JSONData else {
return nil
}
return String(data: data, encoding: String.Encoding.utf8)
}
var JSONData: Data? {
do {
return try JSONSerialization.data(withJSONObject: self, options: [])
} catch {
//print("Problem de-serializing object: \(error)")
}
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment