zoukankan      html  css  js  c++  java
  • Swift网络封装库Moya中文手册之Providers

    Providers

    使用Moya,你可以通过一个 MoyaProvider 的实例发送所有网络请求,通过枚举来指定你要访问的具体API。在配置你的 Endpoint 之后,你差不多就做好了基础配置:

    let provider = MoyaProvider<MyService>()
    

    简单配置后,你就可以使用:

    provider.request(.Zen) { result in
        // `result` is either .Success(response) or .Failure(error)
    }
    

    就是这样!request() 方法返回一个 Cancellable,这只有一个函数,用于取消请求。 更多关于 Result 的信息请查阅 Examples

    记住,target和provider放在什么地方,完全由你自己决定。可以参考 Artsy's implementation 作为示例。

    但不要忘了provider要作为属性持有,如果中途被释放的话,会出现"cancelled"` 的错误提示。

    高级用法

    为了解释清楚 MoyaProvider 的所有结构参数,我们将在下面一个个讲解。

    endpointClosure:

    MoyaProvider 初始化的第一个参数(可选)是一个endpoints闭包,它可以将你的target转换成具体的Endpoint 实例。让我们看看应该怎么写。

    let endpointClosure = { (target: MyTarget) -> Endpoint<MyTarget> in
        let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
        return Endpoint(URL: url, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
    }
    let provider = MoyaProvider(endpointClosure: endpointClosure)
    

    注:这样初始化 MoyaProvider 的时候,不需要再说明target的具体类型,Swift会根据endpointClosure 推断。

    endpointClosure 就是这么简单。MoyaProvider.DefaultEndpointMapping 有默认实现。
    如果需要自定义,请查看 Endpoints 文档。

    requestClosure:

    另一个可选的初始化参数是 requestClosure,可以将 Endpoint 转换为 NSURLRequest。同样,查看 Endpoints 文档可以获得更多信息。

    stubClosure:

    下一个选择是提供一个 stubClosure。它返回一个.Never (默认),或者.Immediate, 或者.Delayed(seconds), 你可以延迟这个stub模拟请求(具体n秒)。例如,.Delayed(0.2) 会把每个stub模拟请求延迟0.2s。 这在单元测试中可以很好的模拟网络延迟。

    这样的好处是当你需要模拟不同于其他的特殊请求时,可以编写自己的闭包。

    let provider = MoyaProvider<MyTarget>(stubClosure: { target: MyTarget -> Moya.StubBehavior in
    	switch target {
    		/* Return something different based on the target. */
    	}
    })
    

    但大多数时候你想对所有targets做同样的模拟测试,这里有三个 MoyaProvider 的函数可以直接调用用。

    MoyaProvider.NeverStub
    MoyaProvider.ImmediatelyStub
    MoyaProvider.DelayedStub(seconds)
    

    所以,如果你就是要做同样的模拟测试,可以像下面这样写:

    let provider = MoyaProvider<MyTarget>(stubClosure: { (_: MyTarget) -> Moya.StubBehavior in return .Immediate })
    let provider = MoyaProvider<MyTarget>(stubClosure: MoyaProvider.ImmediatelyStub)
    

    manager:

    接下来是 manager 参数。默认的,你可以通过基本设置获得一个Alamofire.Manager

    public final class func DefaultAlamofireManager() -> Manager {
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
    
        let manager = Alamofire.Manager(configuration: configuration)
        manager.startRequestsImmediately = false
        return manager
    }
    

    有一点需要特别注意:在AF中,构造一个 Alamofire.Request 会默认立即发起请求,包括在单元测试模拟请求的时候。因此在Moya中, startRequestsImmediately 默认设为 false

    如果你想自定义自己的manager,例如,加上SSL pinning,所有请求都将会通过自定义的manager发送。代码如下:

    let policies: [String: ServerTrustPolicy] = [
        "example.com": .PinPublicKeys(
            publicKeys: ServerTrustPolicy.publicKeysInBundle(),
            validateCertificateChain: true,
            validateHost: true
        )
    ]
    
    let manager = Manager(
        configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: policies)
    )
    
    let provider = MoyaProvider<MyTarget>(manager: manager)
    

    plugins:

    最后,你可能需要一个 plugins 数组。它们在发起请求之前和收到返回值之后回调。这儿已经有一小部分plugins:一个是network activity (NetworkActivityPlugin), 一个打印输出所有network activity (NetworkLoggerPlugin),另一个是 HTTP Authentication.

    例如,你只需要将 [NetworkLoggerPlugin()] 作为参数传递给 Endpointplugins ,就可以允许log。注意:plugin也可以配置,比如 NetworkActivityPlugin 需要一个networkActivityClosure 参数。配置代码如下:

    public final class NetworkActivityPlugin: PluginType {
        
        public typealias NetworkActivityClosure = (change: NetworkActivityChangeType) -> ()
        let networkActivityClosure: NetworkActivityClosure
    
        public init(networkActivityClosure: NetworkActivityClosure) {
            self.networkActivityClosure = networkActivityClosure
        }
    
        // MARK: Plugin
    
        /// Called by the provider as soon as the request is about to start
        public func willSendRequest(request: RequestType, target: TargetType) {
            networkActivityClosure(change: .Began)
        }
    
        /// Called by the provider as soon as a response arrives
        public func didReceiveResponse(data: NSData?, statusCode: Int?, response: NSURLResponse?, error: ErrorType?, target: TargetType) {
            networkActivityClosure(change: .Ended)
        }
    }
    

    networkActivityClosure 是一个闭包,你可以在请求开始或结束时进行一些操作。和network activitiy indicator 一起很好用。
    注意这个闭包的参数 (change: NetworkActivityChangeType) -> (),你只能在request .Began 或者 .Ended 的时候使用,无法提供请求的其他任何细节。

    转载请注明出处http://www.cnblogs.com/liuliuliu/p/5627650.html,并注明转载。

    原文链接
    翻译: bibibi_liuliu
    联系方式: 395985239@qq.com

  • 相关阅读:
    mount命令以及mount ntfs硬盘权限权限与显示的问题 分类: shell ubuntu 2014-11-08 18:29 148人阅读 评论(0) 收藏
    Rebuild my Ubuntu 分类: ubuntu shell 2014-11-08 18:23 193人阅读 评论(0) 收藏
    摄像头参数查看与调节 分类: C/C++ OpenCV 2014-11-08 18:13 138人阅读 评论(0) 收藏
    highgui.h备查 分类: C/C++ OpenCV 2014-11-08 18:11 292人阅读 评论(0) 收藏
    const char*, char const* and char *const 分类: C/C++ OpenCV 2014-11-08 18:10 114人阅读 评论(0) 收藏
    由 argv引出的main参数 分类: C/C++ 2014-11-08 18:00 154人阅读 评论(0) 收藏
    写在新建博客的第一天 分类: fool_tree的笔记本 2014-11-08 17:57 144人阅读 评论(0) 收藏
    Latex笔记(参考文献) 分类: LaTex 2014-11-08 17:41 239人阅读 评论(0) 收藏
    windows下使用github
    C# 笔记——索引器
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/5627650.html
Copyright © 2011-2022 走看看