Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions Examples/GopherExample/GopherExample/NetworkService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ final class NetworkService

func invoke<Model>(resource: TheMovieDatabase,
resource_id: String = DefaultValue.empty_string,
parameters: GopherContent = [:]) async throws -> Model where Model: Codable
parameters: GopherQueryParameter = []) async throws -> Model where Model: Codable
{
return try await service.send(request: resource.request(resource_id: resource_id, parameters: parameters))
}
Expand Down Expand Up @@ -156,7 +156,7 @@ extension NetworkService
return endpoint
}

func request(resource_id: String = DefaultValue.empty_string, parameters: GopherContent = [:]) -> Request
func request(resource_id: String = DefaultValue.empty_string, parameters: GopherQueryParameter = []) -> Request
{
let resource = prepare_resource(resource_id)
let reqBuilder = RequestBuilder()
Expand All @@ -165,6 +165,7 @@ extension NetworkService
.parameters(parameters)
.parameter(Header.api_key, value: Self.api_key)
.parameter(Header.language, value: Locale.current.identifier)
.date_decoding(.formatted(DateFormatter.iso8601_short_date))

return reqBuilder.build()
}
Expand All @@ -175,3 +176,15 @@ enum DefaultValue
{
static let empty_string = ""
}

extension DateFormatter
{
static let iso8601_short_date: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
}
2 changes: 1 addition & 1 deletion Sources/Gopher/Common/NetworkAlias.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ import Foundation

public typealias GopherContent = [String: Any]
public typealias GopherHeader = [String: String]
public typealias GopherQueryParameter = [String: Any]
public typealias GopherQueryParameter = [URLQueryItem]
public typealias GopherTrustCompletion = (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
public typealias GopherTrustHandler = (_ hostname: String, _ completion: @escaping GopherTrustCompletion) -> Void
22 changes: 10 additions & 12 deletions Sources/Gopher/Common/NetworkUtility.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,27 +51,25 @@ public enum NetworkUtility

request.httpMethod = serviceRequest.method.rawValue

if serviceRequest.method == HTTPMethod.get
if !serviceRequest.parameters.isEmpty
{
if !serviceRequest.parameters.isEmpty
{
components.queryItems = serviceRequest.parameters.map { URLQueryItem(name: $0, value: "\($1)") }
components.queryItems = serviceRequest.parameters

request.url = components.url
}
else
{
// Nothing else needs to be done.
}
request.url = components.url
}
else
{
// Nothing else needs to be done.
}

if serviceRequest.method != HTTPMethod.get
{
switch serviceRequest.dataFormat
{
case .json:
request.httpBody = dataFromDictionary(dict: serviceRequest.parameters)
request.httpBody = dataFromDictionary(dict: serviceRequest.body)
case .form:
request.httpBody = generateFormData(parameters: serviceRequest.parameters)
request.httpBody = generateFormData(parameters: serviceRequest.body)
}

debugPrint("-> Request body format: \(serviceRequest.dataFormat)")
Expand Down
30 changes: 25 additions & 5 deletions Sources/Gopher/Common/RequestBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,20 @@ public final class RequestBuilder
private var method: HTTPMethod
private var endpoint: String
private var timeout: TimeInterval
private var parameters: GopherContent
private var parameters: GopherQueryParameter
private var body: GopherContent
private var headers: GopherHeader
private var dateDecodingStrategy: JSONDecoder.DateDecodingStrategy

public init()
{
endpoint = ""
method = HTTPMethod.get
timeout = 60
headers = [:]
parameters = [:]
parameters = []
body = [:]
dateDecodingStrategy = .iso8601
identifier = UUID().uuidString
name = "[\(method.rawValue.uppercased())] \(endpoint.lowercased())"
}
Expand All @@ -42,14 +46,14 @@ public final class RequestBuilder
return self
}

public func parameter(_ key: String, value: Any) -> Self
public func parameter(_ name: String, value: String) -> Self
{
parameters[key] = value
parameters.append(URLQueryItem(name: name, value: value))

return self
}

public func parameters(_ value: GopherContent) -> Self
public func parameters(_ value: GopherQueryParameter) -> Self
{
guard !value.isEmpty
else
Expand Down Expand Up @@ -89,6 +93,20 @@ public final class RequestBuilder
return self
}

public func content(_ value: GopherContent) -> Self
{
body = value

return self
}

public func date_decoding(_ strategy: JSONDecoder.DateDecodingStrategy) -> Self
{
dateDecodingStrategy = strategy

return self
}

public func build() -> Request
{
guard !endpoint.isEmpty
Expand All @@ -101,6 +119,8 @@ public final class RequestBuilder
method: method,
headers: headers,
parameters: parameters,
body: body,
dateDecodingStrategy: dateDecodingStrategy,
timeout: timeout)
return request
}
Expand Down
3 changes: 2 additions & 1 deletion Sources/Gopher/Protocol/NetworkRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ public protocol NetworkRequest
var timeout: TimeInterval { get }
var endpoint: String { get }
var url: URL? { get }
var parameters: GopherContent { get }
var parameters: GopherQueryParameter { get }
var headers: GopherHeader { get }
var body: GopherContent { get }
var dateDecodingStrategy: JSONDecoder.DateDecodingStrategy { get }
var kind: NetworkRequestKind { get }
}
Expand Down
10 changes: 8 additions & 2 deletions Sources/Gopher/Standard/Request.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,26 @@ public struct Request: NetworkRequest
public var endpoint: String
public var url: URL?
public var timeout: TimeInterval
public var parameters: GopherContent
public var parameters: GopherQueryParameter
public var headers: GopherHeader
public var body: GopherContent
public var dateDecodingStrategy: JSONDecoder.DateDecodingStrategy

public init(endpoint: String,
method: HTTPMethod,
headers: GopherHeader = [:],
parameters: GopherContent = [:],
parameters: GopherQueryParameter = [],
body: GopherContent = [:],
dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .iso8601,
timeout: TimeInterval = 60)
{
self.endpoint = endpoint
self.method = method
self.timeout = timeout
self.headers = headers
self.parameters = parameters
self.body = body
self.dateDecodingStrategy = dateDecodingStrategy

identifier = UUID().uuidString
name = "[\(method.rawValue.uppercased())] \(endpoint.lowercased())"
Expand Down