Append parameters to each network call with Moya

2k Views Asked by At

How to append default request parameters, for example AppID, to each and every API call with (Rx) Moya ?

2

There are 2 best solutions below

1
On

Endpoint class in Moya has adding(newHTTPHeaderFields:) which takes a dictionary, here you can provide your additional http headers which will be sent for every request. Documentation link

let endpointClosure = { (target: TargetType) -> Endpoint in
    let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
    return defaultEndpoint.adding(newHTTPHeaderFields: ["AppID": "MY_APP_ID"])
}
let provider = MoyaProvider<TargetType>(endpointClosure: endpointClosure)
0
On
    //Create a BaseMoyaProvider class and add default paramaters 

    import Moya
    import Result
    import SwiftyJSON

    class BaseMoyaProvider {
      static func create<T: TargetType>(service: T.Type) -> (T)->(Endpoint) {
        let closure = { (target: T) -> Endpoint in
          let endpoint = MoyaProvider.defaultEndpointMapping(for: target)

          switch endpoint.task {
          case .requestParameters(
            let _parameters,
            let _encoding):

            let parameters = _parameters
              .appending([
                "AppID" : "XXXXXXXXXXX"
                ])

            let task = Task.requestParameters(
              parameters: parameters,
              encoding: _encoding
            )

            return endpoint
              .replacing(task: task)
          default: return endpoint
          }`enter code here`
        }
        return closure
      }
    } 

//Extend MoyaProvider class

extension MoyaProvider {
  static func build() -> MoyaProvider<Target> {
    let provider = BaseMoyaProvider
      .create(service: Target.self)

    return MoyaProvider<Target>(
      endpointClosure: provider,
      plugins: [ ApiLogger() ]
    )
  }

  // MARK: Request
  func rx_request<T: Mappable>(_ target: Target) -> Observable<T> {
    return Observable.create({ (observer) -> Disposable in
      let request = self.request(target, completion: { (result) in
        //Handle response
      })
      return Disposables.create {
        request.cancel()
      }
    })
  }
}