thieumao

HttpClient

Mar 20th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 5.23 KB | None | 0 0
  1. import Foundation
  2. import SwiftHTTP
  3.  
  4. class HttpClient {
  5.     enum METHOD: String {
  6.         case GET        = "GET"
  7.         case POST       = "POST"
  8.         case UPLOAD     = "UPLOAD"
  9.         case DOWNLOAD   = "DOWNLOAD"
  10.         case DELETE     = "DELETE"
  11.         case PUT        = "PUT"
  12.     }
  13.     enum ErrorCode: Int {
  14.         case OK                         = 0
  15.         case MissingAccessToken         = 1
  16.         case InvalidAccessToken         = 2
  17.        
  18.         case InvalidEmailOrPassword     = 11
  19.         case InvalidParams              = 12
  20.         case FacebookUserNotRegistered  = 13
  21.         case InvalidFacebookToken       = 14
  22.         case UserWasStopped             = 15
  23. //        case UserNotFound               = 15
  24.         case UserTokenExpired           = 16
  25.        
  26.         case Failure                    = 0x8000000
  27.        
  28.         func toString() -> String {
  29.             switch self {
  30.             case .OK: return "OK"
  31.             case .MissingAccessToken: return "MISSING_ACCESS_TOKEN"
  32.             case .InvalidAccessToken: return "INVALID_ACCESS_TOKEN"
  33.                
  34.             case .InvalidEmailOrPassword: return "INVALID_EMAIL_OR_PASSWORD"
  35.             case .InvalidParams: return "INVALID_PARAMS"
  36.             case .FacebookUserNotRegistered: return "FACEBOOK_USER_NOT_REGISTERED"
  37.             default: return "UNKNOWN_ERROR"
  38.             }
  39.         }
  40.     }
  41.    
  42.     typealias Completion = (_ result: String?, _ errorCode: ErrorCode?) -> ()
  43.    
  44.     enum API: String {
  45.         case Login                = "login"
  46.         case Events               = "events"
  47.         case Companies            = "companies"
  48.         case Messages             = "messages"
  49.         case MyPage               = "mypage"
  50.         case Profile              = "profile"
  51.         case AccessToken          = "access_token"
  52.         case CheckIn              = "event/checkin"
  53.         case Resume               = "resume"
  54.         case EditResume           = "edit_resume"
  55.         case MessageDetail        = "message_detail"
  56.         case JobDetail            = "job_detail"
  57.         case Account              = "account"
  58.         case Total_Unread_Message = "total_unread_messages"
  59.         case Schedule             = "schedule"
  60.         case Interview            = "interview"
  61.         case CompanyDetail        = "company_detail"
  62.     }
  63.     private let BaseURL = "https://example.com/"
  64.     private let headers = [
  65.         "Authorization": "Basic ZGlzY286RFNrczNQNktLdXZieGR1cA==",
  66.         "Content-Type": "application/json"
  67.     ]
  68.     private var defaultParameters = [String: Any]()
  69.     private let serializer = JSONParameterSerializer()
  70.    
  71.     static let shared = HttpClient()
  72.    
  73.     func addDefaultParameter(_ key: String, _ value: Any) {
  74.         defaultParameters[key] = value
  75.     }
  76.    
  77.     func request(method: METHOD, api: API, params: Dictionary<String, Any>? = nil, completion: Completion? = nil) {
  78.         var requestParams = defaultParameters
  79.         if let p = params {
  80.             requestParams.merge(with: p)
  81.         }
  82.         LOG(#function, #line, "method: \(method) - params: \(requestParams)")
  83.         switch method {
  84.         case .GET:
  85.             GET(api: api, params: requestParams, completion: completion)
  86.         default:
  87.             POST(api: api, params: requestParams, completion: completion)
  88.         }
  89.     }
  90.    
  91.     private func GET(api: API, params: Dictionary<String, Any>? = nil, completion: Completion? = nil) {
  92.         do {
  93.             let opt = try HTTP.GET(BaseURL + api.rawValue, parameters: params, headers: headers, requestSerializer: serializer)
  94.             startQuery(query: opt, completion: completion)
  95.         } catch _ {
  96.             if let callback = completion {
  97.                 callback(nil, .Failure)
  98.             }
  99.         }
  100.     }
  101.    
  102.     private func POST(api: API, params: Dictionary<String, Any>? = nil, completion: Completion? = nil) {
  103.         do {
  104.             let opt = try HTTP.POST(BaseURL + api.rawValue, parameters: params, headers: headers, requestSerializer: serializer)
  105.             startQuery(query: opt, completion: completion)
  106.         } catch _ {
  107.             if let callback = completion {
  108.                 callback(nil, .Failure)
  109.             }
  110.         }
  111.     }
  112.    
  113.     private func startQuery(query: HTTP, completion: Completion? = nil) {
  114.         var attempted = false
  115.         query.auth = { challenge in
  116.             if let trust = challenge.protectionSpace.serverTrust , !attempted {
  117.                 attempted = true
  118.                 return URLCredential(trust: trust)
  119.             }
  120.             return nil
  121.         }
  122.         query.start { response in
  123.             var result: String?
  124.             var errorCode: ErrorCode?
  125.             if let error = response.error {
  126.                 errorCode = ErrorCode(rawValue: error.code)
  127.                 if errorCode == nil {
  128.                     errorCode = ErrorCode.Failure
  129.                 }
  130.             } else {
  131.                 result = String(data: response.data, encoding: .utf8)
  132.                 errorCode = .OK
  133.             }
  134.            
  135.             if let callback = completion {
  136.                 LOG(#function, #line, "errorCode: \(errorCode)")
  137.                 callback(result, errorCode)
  138.             }
  139.         }
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment