/MPNetworking

Network abstraction layer written in Swift to use in MenaPay iOS projects

Primary LanguageSwiftMIT LicenseMIT

MPNetworking

CocoaPods compatible CocoaPods compatible

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)
}