mirror of
https://github.com/jphong1111/awesome-ios-developer.git
synced 2025-07-20 21:00:19 +07:00
Add files via upload
This commit is contained in:
16
Helper/Network Layer/Services/EndPointType.swift
Normal file
16
Helper/Network Layer/Services/EndPointType.swift
Normal file
@ -0,0 +1,16 @@
|
||||
//
|
||||
// EndPointProtocol.swift
|
||||
// MapDemoApp
|
||||
//
|
||||
// Created by JungpyoHong on 4/25/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol EndPointType{
|
||||
var baseURL: URL { get }
|
||||
var path: String { get }
|
||||
var httpMethod: HTTPMethod { get }
|
||||
var task: HTTPTask { get }
|
||||
var headers: HTTPHeaders? { get }
|
||||
}
|
16
Helper/Network Layer/Services/HTTPMethod.swift
Normal file
16
Helper/Network Layer/Services/HTTPMethod.swift
Normal file
@ -0,0 +1,16 @@
|
||||
//
|
||||
// HTTPMethod.swift
|
||||
// MapDemoApp
|
||||
//
|
||||
// Created by JungpyoHong on 4/25/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
public enum HTTPMethod: String {
|
||||
case get = "GET"
|
||||
case post = "POST"
|
||||
case put = "PUT"
|
||||
case patch = "PATCH"
|
||||
case delete = "DELETE"
|
||||
}
|
25
Helper/Network Layer/Services/HTTPTask.swift
Normal file
25
Helper/Network Layer/Services/HTTPTask.swift
Normal file
@ -0,0 +1,25 @@
|
||||
//
|
||||
// HTTPTask.swift
|
||||
// MapDemoApp
|
||||
//
|
||||
// Created by JungpyoHong on 4/25/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
public typealias HTTPHeaders = [String:String]
|
||||
|
||||
public enum HTTPTask {
|
||||
case request
|
||||
|
||||
case requestParameters(bodyParameters: Parameters?,
|
||||
bodyEncoding: ParameterEncoding,
|
||||
urlParameters: Parameters?)
|
||||
|
||||
case requestParametersAndHeaders(bodyParameters: Parameters?,
|
||||
bodyEncoding: ParameterEncoding,
|
||||
urlParameters: Parameters?,
|
||||
additionHeaders: HTTPHeaders?)
|
||||
|
||||
// case download, upload...etc
|
||||
}
|
40
Helper/Network Layer/Services/NetworkLogger.swift
Normal file
40
Helper/Network Layer/Services/NetworkLogger.swift
Normal file
@ -0,0 +1,40 @@
|
||||
//
|
||||
// NetworkLogger.swift
|
||||
// MapDemoApp
|
||||
//
|
||||
// Created by JungpyoHong on 4/25/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class NetworkLogger {
|
||||
static func log(request: URLRequest) {
|
||||
|
||||
print("\n - - - - - - - - - - OUTGOING - - - - - - - - - - \n")
|
||||
defer { print("\n - - - - - - - - - - END - - - - - - - - - - \n") }
|
||||
|
||||
let urlAsString = request.url?.absoluteString ?? ""
|
||||
let urlComponents = NSURLComponents(string: urlAsString)
|
||||
|
||||
let method = request.httpMethod != nil ? "\(request.httpMethod ?? "")" : ""
|
||||
let path = "\(urlComponents?.path ?? "")"
|
||||
let query = "\(urlComponents?.query ?? "")"
|
||||
let host = "\(urlComponents?.host ?? "")"
|
||||
|
||||
var logOutput = """
|
||||
\(urlAsString) \n\n
|
||||
\(method) \(path)?\(query) HTTP/1.1 \n
|
||||
HOST: \(host)\n
|
||||
"""
|
||||
for (key,value) in request.allHTTPHeaderFields ?? [:] {
|
||||
logOutput += "\(key): \(value) \n"
|
||||
}
|
||||
if let body = request.httpBody {
|
||||
logOutput += "\n \(NSString(data: body, encoding: String.Encoding.utf8.rawValue) ?? "")"
|
||||
}
|
||||
|
||||
print(logOutput)
|
||||
}
|
||||
|
||||
static func log(response: URLResponse) {}
|
||||
}
|
14
Helper/Network Layer/Services/NetworkRouter.swift
Normal file
14
Helper/Network Layer/Services/NetworkRouter.swift
Normal file
@ -0,0 +1,14 @@
|
||||
//
|
||||
// NetworkRouter.swift
|
||||
// MapDemoApp
|
||||
//
|
||||
// Created by JungpyoHong on 4/25/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol NetworkRouter: class {
|
||||
associatedtype EndPoint: EndPointType
|
||||
func request<T: Decodable>(_ route: EndPoint, completion: @escaping NetworkRouterCompletion<T>)
|
||||
func cancel()
|
||||
}
|
115
Helper/Network Layer/Services/Router.swift
Normal file
115
Helper/Network Layer/Services/Router.swift
Normal file
@ -0,0 +1,115 @@
|
||||
//
|
||||
// Router.swift
|
||||
// MapDemoApp
|
||||
//
|
||||
// Created by JungpyoHong on 4/25/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
typealias NetworkRouterCompletion<T> = (Result<T, AppError>)->()
|
||||
|
||||
class Router<EndPoint: EndPointType>: NetworkRouter {
|
||||
private var task: URLSessionTask?
|
||||
private let session = URLSession(configuration: .default)
|
||||
|
||||
func request<T: Decodable>(_ route: EndPoint, completion: @escaping NetworkRouterCompletion<T>) {
|
||||
|
||||
do {
|
||||
let request = try self.buildRequest(from: route)
|
||||
task = session.dataTask(with: request) { data, response, error in
|
||||
let completionOnMain: (Result<T, AppError>) -> Void = { result in
|
||||
DispatchQueue.main.async {
|
||||
completion(result)
|
||||
}
|
||||
}
|
||||
guard error == nil else {
|
||||
completionOnMain(.failure(.serverError))
|
||||
return
|
||||
}
|
||||
guard let response = response as? HTTPURLResponse else {
|
||||
completionOnMain(.failure(.badResponse))
|
||||
return
|
||||
}
|
||||
switch response.statusCode {
|
||||
case 200...299:
|
||||
guard let unwrappedData = data else {
|
||||
completionOnMain(.failure(.noData))
|
||||
return
|
||||
}
|
||||
do {
|
||||
let data = try JSONDecoder().decode(T.self, from: unwrappedData)
|
||||
completionOnMain(.success(data))
|
||||
} catch {
|
||||
print(error)
|
||||
completionOnMain(.failure(.parseError))
|
||||
}
|
||||
|
||||
default:
|
||||
completionOnMain(.failure(.genericError("Something went wrong")))
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
completion(.failure(.badRequest))
|
||||
}
|
||||
task?.resume()
|
||||
}
|
||||
func cancel() {
|
||||
self.task?.cancel()
|
||||
}
|
||||
|
||||
fileprivate func buildRequest(from route: EndPoint) throws -> URLRequest {
|
||||
|
||||
var request = URLRequest(url: route.baseURL.appendingPathComponent(route.path),
|
||||
cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,
|
||||
timeoutInterval: 10.0)
|
||||
|
||||
request.httpMethod = route.httpMethod.rawValue
|
||||
do {
|
||||
switch route.task {
|
||||
case .request:
|
||||
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||
case .requestParameters(let bodyParameters,
|
||||
let bodyEncoding,
|
||||
let urlParameters):
|
||||
|
||||
try self.configureParameters(bodyParameters: bodyParameters,
|
||||
bodyEncoding: bodyEncoding,
|
||||
urlParameters: urlParameters,
|
||||
request: &request)
|
||||
|
||||
case .requestParametersAndHeaders(let bodyParameters,
|
||||
let bodyEncoding,
|
||||
let urlParameters,
|
||||
let additionalHeaders):
|
||||
|
||||
self.addAdditionalHeaders(additionalHeaders, request: &request)
|
||||
try self.configureParameters(bodyParameters: bodyParameters,
|
||||
bodyEncoding: bodyEncoding,
|
||||
urlParameters: urlParameters,
|
||||
request: &request)
|
||||
}
|
||||
return request
|
||||
} catch {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
private func configureParameters(bodyParameters: Parameters?,
|
||||
bodyEncoding: ParameterEncoding,
|
||||
urlParameters: Parameters?,
|
||||
request: inout URLRequest) throws {
|
||||
do {
|
||||
try bodyEncoding.encode(urlRequest: &request,
|
||||
bodyParameters: bodyParameters, urlParameters: urlParameters)
|
||||
} catch {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
private func addAdditionalHeaders(_ additionalHeaders: HTTPHeaders?, request: inout URLRequest) {
|
||||
guard let headers = additionalHeaders else { return }
|
||||
for (key, value) in headers {
|
||||
request.setValue(value, forHTTPHeaderField: key)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user