Skip to content

Instantly share code, notes, and snippets.

View JeremyXue77's full-sized avatar
๐Ÿˆ
Keep going

Jeremy Xue JeremyXue77

๐Ÿˆ
Keep going
View GitHub Profile
fileprivate func addAdditionalHeaders(_ additionalHeader: HTTPHeaders?,
request: inout URLRequest) {
guard let headers = additionalHeader else { return }
for (key, value) in headers {
request.setValue(value, forHTTPHeaderField: key)
}
}
fileprivate func configureParameters(bodyParameters: Parameters?,
urlParameters: Parameters?,
request: inout URLRequest) throws {
do {
// bodyParameters ็‚บ JSON ๆ ผๅผ๏ผŒไฝฟ็”จ JSONParameterEncoder ไพ†็ทจ็ขผ
if let bodyParameters = bodyParameters {
try JSONParameterEncoder.encode(urlRequest: &request, with: bodyParameters)
}
// urlParameters ็‚บ URL ็ทจ็ขผ๏ผŒไฝฟ็”จ JSONParameterEncoder ไพ†็ทจ็ขผ
if let urlParameters = urlParameters {
fileprivate func buildRequest(from route: EndPoint) throws -> URLRequest {
// ๅปบ็ซ‹ URLRequest ่ฎŠๆ•ธ๏ผŒ้€้Ž route.baseURL ๅพŒๆ–นๅŠ ไธŠ็‰นๅฎš่ทฏๅพ‘ route.path ็”Ÿๆˆ
var request = URLRequest(url: route.baseURL.appendingPathComponent(route.path),
cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,
timeoutInterval: 10.0)
// ่จญๅฎš httpMethod ็‚บ route.httpMethod(enum) ็š„ rawValue
request.httpMethod = route.httpMethod.rawValue
do {
// ๆ นๆ“š switch case ๅˆคๆ–ท task request ้กžๅž‹๏ผŒๅ‘ผๅซๅˆ้ฉ็š„ Encoder
class Router<EndPoint: EndPointType>: NetworkRouter {
private var task: URLSessionTask?
func request(_ route: EndPoint, completion: @escaping NetworkRouterCompletion) {
}
func cancel() {
protocol NetworkRouter: class {
associatedtype EndPoint: EndPointType
func request(_ route: EndPoint, completion: @escaping NetworkRouterCompletion)
func cancel()
}
public struct JSONParameterEncoder: ParameterEncoder {
public static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws {
do {
let jsonAsData = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
urlRequest.httpBody = jsonAsData
if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
} catch {
public struct URLParameterEncoder: ParameterEncoder {
public static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws {
guard let url = urlRequest.url else { throw NetworkError.missingURL }
if var urlComponents = URLComponents(url: url,
resolvingAgainstBaseURL: false), !parameters.isEmpty {
urlComponents.queryItems = [URLQueryItem]()
public enum NetworkError: String, Error {
case parametersNil = "Parameters were nil."
case encodingFail = "Parameters encoding failed."
case missingURL = "URL is nil."
}
public protocol ParameterEncoder {
static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws
}
public enum HTTPTask {
case request
case requestWithParameters(bodyParameters: Parameters?,
urlParameters: Parameters?)
case requestWithParametersAndHeaders(bodyParameters: Parameters?,
urlParameters: Parameters?,
additionHeaders: HTTPHeaders?)