Merge pull request #173 from TouchInstinct/feature/array_request_parameter

Added ability to pass an array parameter in request
This commit is contained in:
Ivan Babkin 2018-12-19 13:39:49 +03:00 committed by GitHub
commit c19f56ecf6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 132 additions and 9 deletions

View File

@ -1,4 +1,10 @@
# Changelog
### 0.9.4
- **Add**: initialization of `ApiRequestParameters`, that takes an array as a request parameter.
- **Add**: `NetworkServiceConfiguration.apiRequestParameters` method, that creates `ApiRequestParameters` with array request parameter.
- **Add**: `SessionManager.request` method, that takes an array as a request parameter.
- **Add**: `RequestUsageError` error, that represents wrong usage of requset parameters.
### 0.9.3
- **Add**: `Insert`/`Remove` section with animation functions to `TableKit`. Also make new function `Replace` that uses new `Insert`/`Remove` to animate section replace.

View File

@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "LeadKit"
s.version = "0.9.3"
s.version = "0.9.4"
s.summary = "iOS framework with a bunch of tools for rapid development"
s.homepage = "https://github.com/TouchInstinct/LeadKit"
s.license = "Apache License, Version 2.0"

View File

@ -24,20 +24,86 @@ import Alamofire
import RxSwift
import RxAlamofire
/// Enum that represents wrong usage of requset parameters
///
/// - getMethodForbidden: invalid usage of get method
/// - urlEncodingForbidden: invalid usage of URLEncoding
enum RequestUsageError: Error {
case getMethodForbidden
case urlEncodingForbidden
}
public extension Reactive where Base: SessionManager {
/// Creates an observable of the `Request`.
///
/// - Parameters:
/// - method: Alamofire method object
/// - url: An object adopting `URLConvertible`
/// - parameters: An array of JSON objects 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: [Any]? = nil,
encoding: JSONEncoding = .default,
headers: [String: String]? = nil)
-> Observable<DataRequest> {
return Observable.deferred {
guard method != .get else {
assertionFailure("Unable to pass array in get request")
throw RequestUsageError.getMethodForbidden
}
let urlRequest = try URLRequest(url: try url.asURL(), method: method, headers: headers)
let encodedUrlRequest = try encoding.encode(urlRequest, withJSONObject: parameters)
return self.request(urlRequest: encodedUrlRequest)
}
}
/// Method which executes request with given api parameters
///
/// - Parameter requestParameters: api parameters to pass Alamofire
/// - Returns: Observable with request
func apiRequest(requestParameters: ApiRequestParameters)
-> Observable<DataRequest> {
return request(requestParameters.method,
requestParameters.url,
parameters: requestParameters.parameters,
encoding: requestParameters.encoding,
headers: requestParameters.headers)
let requestObservable: Observable<DataRequest>
switch requestParameters.parameters {
case .dictionary(let parameters)?:
requestObservable = request(requestParameters.method,
requestParameters.url,
parameters: parameters,
encoding: requestParameters.encoding,
headers: requestParameters.headers)
case .array(let parameters)?:
guard let encoding = requestParameters.encoding as? JSONEncoding else {
assertionFailure("Invalid encoding type with array parameter")
return .error(RequestUsageError.urlEncodingForbidden)
}
requestObservable = request(requestParameters.method,
requestParameters.url,
parameters: parameters,
encoding: encoding,
headers: requestParameters.headers)
case .none:
requestObservable = request(requestParameters.method,
requestParameters.url,
parameters: nil as Parameters?,
encoding: requestParameters.encoding,
headers: requestParameters.headers)
}
return requestObservable
.map { $0.validate(statusCode: self.base.acceptableStatusCodes) }
}

View File

@ -27,9 +27,18 @@ import Alamofire
*/
public struct ApiRequestParameters {
/// Enum which keeps parameters type for request body
///
/// - dictionary: dictionary parameter
/// - array: array parameter
enum RequestParameters {
case dictionary(Parameters)
case array([Any])
}
let method: HTTPMethod
let url: URLConvertible
let parameters: Parameters?
let parameters: RequestParameters?
let encoding: ParameterEncoding
let headers: HTTPHeaders?
@ -41,9 +50,30 @@ public struct ApiRequestParameters {
self.method = method
self.url = url
self.parameters = 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: [Any]? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil) {
self.method = method
self.url = url
self.encoding = encoding
self.headers = headers
if let parameters = parameters {
self.parameters = .array(parameters)
} else {
self.parameters = nil
}
}
}

View File

@ -95,5 +95,26 @@ public extension NetworkServiceConfiguration {
encoding: requestEncoding ?? encoding,
headers: requestHeaders)
}
/// Convenient method to create ApiRequestParameters.
///
/// - Parameters:
/// - relativeUrl: Url that will be concatenated with base url.
/// - method: HTTP method to use for request.
/// - parameters: An array of JSON objects to apply to a URLRequest.
/// - requestEncoding: Encoding type to use. If passed nil, configuration encoding will be used.
/// - requestHeaders: Dictionary of headers to apply to a URLRequest.
/// - Returns: Initialized instance of ApiRequestParameters with given parameters.
func apiRequestParameters(relativeUrl: String,
method: HTTPMethod = .get,
parameters: [Any]? = nil,
requestEncoding: ParameterEncoding? = nil,
requestHeaders: HTTPHeaders? = nil) -> ApiRequestParameters {
return ApiRequestParameters(url: baseUrl + relativeUrl,
method: method,
parameters: parameters,
encoding: requestEncoding ?? encoding,
headers: requestHeaders)
}
}