Добавлять параметры к каждому сетевому вызову с Мойей - PullRequest
0 голосов
/ 09 ноября 2018

Как добавить параметры запроса по умолчанию, например AppID, к каждому вызову API с (Rx) Мойей?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019
    //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()
      }
    })
  }
}
0 голосов
/ 13 ноября 2018

Endpoint класс в Мойя имеет adding(newHTTPHeaderFields:), который принимает словарь, здесь вы можете указать дополнительные http-заголовки, которые будут отправляться для каждого запроса. Документация ссылка

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