MPNetworking
Network abstraction layer written in Swift to use in MenaPay iOS projects
Installation
MPNetworking supports CocoaPods
pod 'MPNetworking', '0.2.2'
NetworkManager
NetworkManager must be configured with at least four paramaters to make a call that doesn't requier bearer authentication
- baseURL
- clientVersion
- clientType
- userType
import Foundation
import MPNetworking
class ViewController: UIViewController {
var networking: NetworkManager!
override func viewDidLoad() {
super.viewDidLoad()
networking = NetworkManager(baseURL: "myawesomeplatform.api.com",
userType: "RESELLER",
clientType: "menapay-business",
clientVersion: "v3")
}
}
In order to set the token, setToken must be called for once
/// token: String
self.networking.setToken(token)
Afterwards there is no need to set the token again. NetworkManager will handle if the token header is required for the desired endpoint
Endpoint
There are two parameters required to make a call with NetworkManager. An Endpoint and an Object with codable type. To create an endpoint it is recommended to add an static extension method for Endpoint that returns Endpoint object
// MARK: Transcation Endpoints
extension Endpoint {
static func getAllTranscations() -> Endpoint {
return Endpoint(path: "/transaction/corporate/filter",
method: .get,
task: .requestParameters(["type": "USER",
"status": "COMPLETED"]),
parametersEncoding: .query)
}
}
authenticationRequired must set to false if the request doesn't require bearer authentication
// MARK: An Endpoint doesn't require authentication
extension Endpoint {
static func getCountries() -> Endpoint {
return Endpoint(path: "/country/list",
method: .get,
task: .requestPlain,
authenticationRequired: false,
parametersEncoding: .query)
}
}
Making Requests
NetworkManager decodes the requested type so there is no need to decode it again
import MPNetworking
// MARK: Country Loader
class CountryLoader {
var networking: NetworkManager
init(networking: NetworkManager) {
self.networking = networking
}
func getCountries() {
networking.request(endpoint: .getCountries()) { result in
switch result {
case .success(let responseData):
self.handleResponse(responseData)
case .failure(let error):
self.handleError(error)
}
}
}
}
NetworkError
At some if the NetworkManager fails to make the request, it returns a NetworkError
public enum NetworkError: Error {
case networkFailure
case unAuthorized
case emptyJSONData
case noValidEthererumAddressFound
case insufficentEthereumBalance(Data)
}