DDRouter/Encoding/ParameterEncoding.swift (45 lines of code) (raw):
import Foundation
public typealias Parameters = [String: Any]
// MARK: - ParameterEncoding
enum ParameterEncoding {
static func encode(
urlRequest: inout URLRequest,
bodyParameters: Encodable?,
urlParameters: Parameters?
) throws {
if let urlParameters = urlParameters {
guard let url = urlRequest.url else {
throw NetworkError.encodingFailed
}
urlRequest.url = try ParameterEncoding.getEncodedURL(
url: url,
parameters: urlParameters
)
}
if let bodyParameters = bodyParameters {
urlRequest.httpBody = try ParameterEncoding.getEncoded(encodable: bodyParameters)
}
}
// encoding functions // todo: make these more similar
private static func getEncoded(encodable: Encodable) throws -> Data {
guard let encoded = try? JSONEncoder().encode(AnyEncodable(encodable)) else {
throw NetworkError.encodingFailed
}
return encoded
}
private static func getEncodedURL(url: URL, parameters: Parameters) throws -> URL {
guard
!parameters.isEmpty, // so what if they are? encode empty
var urlComponents = URLComponents( // what does this do?
url: url,
resolvingAgainstBaseURL: false
) else {
throw NetworkError.encodingFailed
}
urlComponents.queryItems = parameters.map { key, value in
URLQueryItem(name: key, value: "\(value)")
}
guard let url = urlComponents.url else {
throw NetworkError.encodingFailed
}
return url
}
}