Skip to content

Instantly share code, notes, and snippets.

@bfernandesbfs
Created April 12, 2017 21:54
Show Gist options
  • Save bfernandesbfs/5f83049609f98458f030182f4db8bb05 to your computer and use it in GitHub Desktop.
Save bfernandesbfs/5f83049609f98458f030182f4db8bb05 to your computer and use it in GitHub Desktop.

Revisions

  1. bfernandesbfs created this gist Apr 12, 2017.
    123 changes: 123 additions & 0 deletions Request.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,123 @@
    public typealias NetworkCompletion = ((_ result: Response<Data?>) -> Void)?

    public enum Method: String {
    case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT
    }

    public class Request {

    fileprivate var headers: [String: String] = ["Content-Type": "application/json"]
    fileprivate var task : URLSessionDataTask!

    public init() {
    }

    public func send(method: Method, url: String, parameter: [String: Any], completion: NetworkCompletion) {
    if method == .GET {
    requestData(method: method, url: url, queryParameters: parameter, completion: completion)
    } else {
    requestData(method: method, url: url, bodyParameters: parameter, completion: completion)
    }
    }

    public func setHeaders(key:String, value:String) {
    headers = [key: value]
    }

    public func cancelTask() {
    guard task != nil else {return}
    task.cancel()
    }

    /**
    MARK: - Private Methods
    */
    private func requestData(method: Method,
    url:String,
    queryParameters: [String: Any]? = nil,
    bodyParameters: [String: Any]? = nil,
    completion: NetworkCompletion) {

    let url = URL(string: url, relativeTo: URL(string:"https://api.github.com/"))!
    do {
    let request = try createURLRequest(url: url,
    method: method.rawValue,
    queryParameters: queryParameters,
    bodyParameters: bodyParameters,
    headers: headers)

    task = URLSession.sessionDefault.dataTask(with: request,
    completionHandler: { (data, response, error) in
    return self.parseTo(data,
    request: request,
    response: response,
    error: error,
    completion: completion)
    })

    task.resume()
    } catch {
    completion?(Response(request: nil, response: nil, data: nil, result: Result.failure(error)))
    }
    }

    private func createURLRequest(url: URL, method: String,
    queryParameters: [String: Any]?,
    bodyParameters: [String: Any]?,
    headers: [String: String]?)
    throws -> URLRequest {

    var actualURL: URL = url
    if let queryParameters = queryParameters {
    var components = URLComponents(url: url, resolvingAgainstBaseURL: true)!
    components.queryItems = queryParameters.map { (key, value) in
    URLQueryItem(name: key, value: value as? String)
    }
    actualURL = components.url!
    }

    print(actualURL)
    var request = URLRequest(url: actualURL)
    request.httpMethod = method

    if let bodyParameters = bodyParameters {
    request.httpBody = try JSONSerialization.data(withJSONObject: bodyParameters, options: [])
    }

    if let headers = headers {
    for (field, value) in headers {
    request.addValue(value, forHTTPHeaderField: field)
    }
    }
    return request
    }

    private func parseTo(_ data: Data?,
    request: URLRequest,
    response:URLResponse?,
    error: Error?,
    completion: NetworkCompletion) {

    //todo: Não ficou bom isso
    guard error == nil else {
    completion?(Response(request: request,
    response: response as? HTTPURLResponse,
    data: nil,
    result: Result.failure(error!)))
    return
    }
    //todo: e nem isso
    guard data != nil else {
    completion?(Response(request: request,
    response: response as? HTTPURLResponse,
    data: nil,
    result: Result.failure(error!)))
    return
    }

    completion?(Response(request: request,
    response: response as? HTTPURLResponse,
    data: data,
    result: Result.success(data)))
    }
    }