使用 Moya 将参数附加到每个网络调用

Posted

技术标签:

【中文标题】使用 Moya 将参数附加到每个网络调用【英文标题】:Append parameters to each network call with Moya 【发布时间】:2018-11-09 13:03:19 【问题描述】:

如何使用 (Rx) Moya 将默认请求参数(例如 AppID)附加到每个 API 调用?

【问题讨论】:

检查this 和this。他们应该可以帮助您找到自己的方式。 【参考方案1】:

Moya 中的Endpoint 类有adding(newHTTPHeaderFields:),它需要一个字典,在这里您可以提供您的附加http 标头,这些标头将为每个请求发送。文档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)

【讨论】:

谢谢!但这并不能解决附加默认参数的问题。据我所知,该代码仅允许附加 HTTP 标头。【参考方案2】:
    //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()
      
    )
  

【讨论】:

以上是关于使用 Moya 将参数附加到每个网络调用的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 作为参数传递 swift

Moya/Alamofire - 具有相同键的 URL 编码参数

Moya中的参数编码

如何使用每个实现的附加参数/信息来实现接口

无法使用参数列表调用类型“附加”

如何在 Moya 中添加参数?