Swift - RxMoya 基本设置

通过HTTPHeader设置公共请求参数

在实际开发中我们可能会需要在请求头内添加一些公共请求参数,如用于识别一些平台标志、辨别接口的版本号。你可以定义一个Endpoint的闭包.

let endpointClosure = { (target: T) -> Endpoint<T> in

let url = target.baseURL.appendingPathComponent(target.path).absoluteString

let endpoint = Endpoint<T>(url: url, sampleResponseClosure: { 
   .networkResponse(200, target.sampleData) }, 
    method: target.method, 
    parameters: target.parameters, 
    parameterEncoding: target.parameterEncoding)
    
 return endpoint.adding(newHTTPHeaderFields: 
                        ["x-platform" : "iOS", 
                        "x-interface-version" : "1.0"])}

然后在创建请求的Provider把它添加上去

let provider = RxMoyaProvider<APIManager>(endpointClosure: endpointClosure)

通过插件的方式监听网络状态

通常我们会在进行网络请求的时候进行一些状态展示,如loading,那么你可以通过插件的方式来实现。Moya默认有4个插件:

AccessTokenPlugin 管理AccessToken的插件

CredentialsPlugin 管理认证的插件

NetworkActivityPlugin 管理网络状态的插件

NetworkLoggerPlugin 管理网络log的插件

在这里就演示一下NetworkActivityPlugin的使用:

    let networkPlugin = NetworkActivityPlugin { (type) in
    switch type {
    case .began:
        print("显示loading")
    case .ended:
        print("隐藏loading")
    }
}

同样在创建请求的Provider把它添加上去即可

 let provider = RxMoyaProvider<APIManager>(plugins:[networkPlugin]) 

当然你也可以自定义一些功能的插件,只需要实现PluginType协议,具体功能实现可参考Moya默认的插件:

final class CustomPlugin: PluginType {
  // MARK: Plugin
}

设置接口的超时时间

一般网络的请求需要根据具体的业务接口设置合适的超时时间,你可以参照一下方法进行设置

    let requestClosure = { (endpoint: Endpoint<T>, done: @escaping MoyaProvider<T>.RequestResultClosure) in
    guard var request = endpoint.urlRequest else { return }
    request.timeoutInterval = 30    //设置请求超时时间
    done(.success(request))
}

同样在创建请求的Provider把它添加上去即可

let provider = RxMoyaProvider<APIManager>(requestClosure: requestClosure)

最后,这些设置最好用一个 struct 去管理.

Example:

struct HttpArgument<T: TargetType> { 
    let endpointClosure = .....
    let requestClosure = ......
    let networkPlugin = ......
    let accessTokenPlugin = .....
}

使用的时候

   private lazy var provider: RxMoyaProvider = { () -> RxMoyaProvider<APIManager> in
    let argument = HttpArgument<APIManager>()
    let provider = RxMoyaProvider<APIManager>(endpointClosure: argument.endpointClosure,
                                            plugins:[argument.networkPlugin])
    
    return provider
}()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,118评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,955评论 25 709
  • 文章摘自Moya官方文档 Targets Moya的使用始于定义一个target——典型的是定义一个符合Targe...
    Jt_Self阅读 16,348评论 0 27
  • 放弃错误的道路其实是对人生及时的止损。 001接受“放弃”。从小我们接受的教育就是要我们努力坚持,而“放弃”则一直...
    小疯子会好好的阅读 1,468评论 0 1

友情链接更多精彩内容