Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Moya

 Moya

Saritasa team meeting about Moya
API router manager

Agapov Alex

August 11, 2017
Tweet

More Decks by Agapov Alex

Other Decks in Programming

Transcript

  1. 1. Target setup 2. Object map, JSON parse 3. Sample

    Data testing 4. Custom Provider & Manager (Cache, Timeout, etc.) 5. Plugins 6. Authentication, Authorization (Tokens, OAuth)
  2. 1. Target Setup Target parameters to convert into request public

    enum Github { case repos } extension Github: TargetType { var baseURL: URL { return "https: //github.com" } var method: Moya.Method { return .get } var path: String { return "/repos" } var parameters: [String: Any] { return [] } var parameterEncoding: ParameterEncoding { return JSONEncoding.default } var sampleData: Data { return "".data(…) } var task: Task { return .request } // download/upload var headers: [String: String]? { return nil } } // Create instance of target provider let GithubProvider = MoyaProvider<Github>() Provider can be configured Enum method list
  3. 2. Object map, JSON parse 7MB of data.
 Result in

    milliseconds. Swift 4 (AUG '17) - slow in Object Mapping. Compared Marshal, Decodable, Mapper, Genome by interface. Decided to use Marshal. (+Moya/Marshal extension for easier .mapArray(User.self) method on response)
  4. 3. Sample Data testing Stub closure is used to return

    sample data. Can be modified or changed to custom Stub Closure. // sampleData: Data in Github should be implemented // Create instance of target provider let githubProvider = MoyaProvider<Github>( stubClosure: MoyaProvider<Github>.immediatelyStub ) githubProvider .request(•cameras) { (result) in switch result { case .success(let response): let users: [User] = (try? response.mapArray()) ?? [] case .failure(let error): // Moya error } Map response data using Marshal extension. Sample data defined in Github TargetType will return here.
  5. 4. Custom Provider Provider maps Targets to Endpoints. Can be

    modified to change sample response, parameters, etc. Possible way to add Auth Token. // Custom Provider let githubProvider = MoyaProvider<Github>( endpointClosure: (TargetType) -> Endpoint<TargetType>, requestClosure: (Endpoint<TargetType>, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: (TargetType) -> StubBehavior, manager: Manager, plugins: [PluginType], ) .neverStub, .immediatelyStub, .delayedStub(seconds). Can be different based on target (with closure setup) Provider maps Endpoints to Request. Can be used to change cookie settings or other properties of URLRequest in Endpoint. Alamofire.Manager setup Side effects to modify network activity on different steps
  6. 5. Plugins public protocol PluginType { /// Called to modify

    a request before sending func prepare(_ request: URLRequest, target: TargetType) -> URLRequest /// Called immediately before a request is sent over the network (or stubbed). func willSend(_ request: RequestType, target: TargetType) /// Called after a response has been received, but before the MoyaProvider has invoked its completion handler. func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) /// Called to modify a result before completion func process(_ result: Result<Moya.Response, MoyaError>, target: TargetType) -> Result<Moya.Response, MoyaError> } Default plugins in Moya: CredentialsPlugin - uses URLCredentials to authenticate NetworkActivityPlugin - tracks network activity began/finished with closure parameter NetworkLoggerPlugin - logs information on each stage (with print() or any other logger) AccessTokenPlugin - adds token with "Authorization: Bearer <token>" format
  7. 6. Authentication // Create plugin with token let plugin =

    AccessTokenPlugin(token: "<long token>") // Provider + plugin let githubProvider = MoyaProvider<Github>( plugins: [plugin] ) Provider can use AccessTokenPlugin with Bearer <token> AccessTokenPlugin inserts token into every request header