diff --git a/Sources/Extensions/Alamofire/SessionManager+Extensions.swift b/Sources/Extensions/Alamofire/SessionManager+Extensions.swift index 07eb3ee7..1ac27e84 100644 --- a/Sources/Extensions/Alamofire/SessionManager+Extensions.swift +++ b/Sources/Extensions/Alamofire/SessionManager+Extensions.swift @@ -26,35 +26,37 @@ import RxAlamofire public extension Reactive where Base: SessionManager { - /** - Creates an observable of the `Request`. - - - parameter method: Alamofire method object - - parameter url: An object adopting `URLConvertible` - - parameter parameters: An array of dictionaries containing all necessary options - - parameter encoding: The kind of encoding used to process parameters - - parameter header: A dictionary containing all the additional headers - - - returns: An observable of the `Request` - */ + + /// Creates an observable of the `Request`. + /// + /// - Parameters: + /// - method: Alamofire method object + /// - url: An object adopting `URLConvertible` + /// - parameters: An array of dictionaries containing all necessary options + /// - encoding: The kind of encoding used to process parameters + /// - headers: A dictionary containing all the additional headers + /// - Returns: An observable of the `Request` public func request(_ method: Alamofire.HTTPMethod, _ url: URLConvertible, - parameters: [Parameters]? = nil, - encoding: ParameterEncoding = URLEncoding.default, - headers: [String: String]? = nil - ) - -> Observable - { + parameters: [Any]? = nil, + encoding: ParameterEncoding = JSONEncoding.default, + headers: [String: String]? = nil) + -> Observable { + return Observable.deferred { - var urlRequest = URLRequest(url: try url.asURL()) - urlRequest.httpMethod = method.rawValue - urlRequest.allHTTPHeaderFields = headers - urlRequest.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) - - if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { - urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") + let urlRequest = try URLRequest(url: try url.asURL(), method: method, headers: headers) + + if let encoding = encoding as? JSONEncoding { + let encodedUrlRequest = try encoding.encode(urlRequest, withJSONObject: parameters) + self.request(urlRequest: encodedUrlRequest) + } else { + assertionFailure("Invalid encoding type") } - + + if method == .get { + assertionFailure("Unable to pass array in get request") + } + return self.request(urlRequest: urlRequest) } } @@ -69,18 +71,24 @@ public extension Reactive where Base: SessionManager { let requestObservable: Observable switch requestParameters.parameters { - case .dictionary(let parameters): + case .dictionary(let parameters)?: requestObservable = request(requestParameters.method, requestParameters.url, parameters: parameters, encoding: requestParameters.encoding, headers: requestParameters.headers) - case .array(let parameters): + case .array(let parameters)?: requestObservable = request(requestParameters.method, requestParameters.url, parameters: parameters, encoding: requestParameters.encoding, headers: requestParameters.headers) + case .none: + requestObservable = request(requestParameters.method, + requestParameters.url, + parameters: nil as Parameters?, + encoding: requestParameters.encoding, + headers: requestParameters.headers) } return requestObservable diff --git a/Sources/Structures/Api/ApiRequestParameters.swift b/Sources/Structures/Api/ApiRequestParameters.swift index 99c0c2ca..1a065c2a 100644 --- a/Sources/Structures/Api/ApiRequestParameters.swift +++ b/Sources/Structures/Api/ApiRequestParameters.swift @@ -22,12 +22,14 @@ import Alamofire -/** - * Enum which keeps parameters type for request body - */ -public enum ParametersType { - case dictionary(_ parameter: Parameters?) - case array(_ array: [Parameters]?) + +/// Enum which keeps parameters type for request body +/// +/// - dictionary: dictionary parameter +/// - array: array parameter +public enum RequestParameters { + case dictionary(Parameters) + case array([Any]) } /** @@ -37,7 +39,7 @@ public struct ApiRequestParameters { let method: HTTPMethod let url: URLConvertible - let parameters: ParametersType + let parameters: RequestParameters? let encoding: ParameterEncoding let headers: HTTPHeaders? @@ -49,22 +51,30 @@ public struct ApiRequestParameters { self.method = method self.url = url - self.parameters = .dictionary(parameters) self.encoding = encoding self.headers = headers + if let parameters = parameters { + self.parameters = .dictionary(parameters) + } else { + self.parameters = nil + } } public init(url: URLConvertible, method: HTTPMethod = .get, - parameters: [Parameters]? = nil, + parameters: [Any]? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) { self.method = method self.url = url - self.parameters = .array(parameters) self.encoding = encoding self.headers = headers + if let parameters = parameters { + self.parameters = .array(parameters) + } else { + self.parameters = nil + } } } diff --git a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift index 7070f4e4..77d53424 100644 --- a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift +++ b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift @@ -107,7 +107,7 @@ public extension NetworkServiceConfiguration { /// - Returns: Initialized instance of ApiRequestParameters with given parameters. func apiRequestParameters(relativeUrl: String, method: HTTPMethod = .get, - parameters: [Parameters]? = nil, + parameters: [Any]? = nil, requestEncoding: ParameterEncoding? = nil, requestHeaders: HTTPHeaders? = nil) -> ApiRequestParameters { return ApiRequestParameters(url: baseUrl + relativeUrl,