• Swift网络请求(Moya篇)


      在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等。但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题。Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置。具体的介绍可以参考Moya的官方链接,结构图如下:

      接下来就介绍一下Moya的一些常见的用法:

    (一)根据业务需求创建具体请求:

      打比方现在我们需要书写账户的相关接口,如Login、userInfo。那么首先我们得创建AccountService:

    enum AccountService {
        case login(phoneNum: NSInteger,passWord: NSInteger)
        case logout
    }

      然后让AccountService实现TargetType协议,定义请求需要的基本信息:

    extension AccountService: TargetType {
        var baseURL: URL {
            return URL(string: ServiceBaseURL)!
        }
        
        var path: String {
            switch self {
            case .login(_, _):
                return "accountService/login"
            case .logout:
                return "accountService/logout"
            }
        }
        
        var method: Moya.Method {
            switch self {
            case .login(_, _):
                return .post
            case .logout:
                return .get
            }
        }
        
        var parameters: [String: Any]? {
            switch self {
            case .login(let phoneNum, let passWord):
                return ["phoneNum": phoneNum, "passWord": passWord]
            case .logout:
                return nil
            }
        }
        
        var parameterEncoding: ParameterEncoding {
            return JSONEncoding.default // Send parameters as JSON in request body
        }
        
        var sampleData: Data {
            return "".data(using: .utf8)!
        }
        
        var task: Task {
            return .request
        }
        
    }

      如上我们就已经完成了网络请求所需要的一个endpoint。接着通过Moya提供一个发送请求的Provider就完成了基本的使用:

    let provider = MoyaProvider<AccountService>()

    provider.request(.login(phoneNum: 12345678901, passWord: 123456)) { result in
                switch result {
                case let .success(response):
                    //...............
                    break
                case let .failure(error):
                    //...............
                    break
                }
            }
    
    

    (二)通过HTTPHeader设置公共请求参数

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

    let publicParamEndpointClosure = { (target: AccountService) -> Endpoint<AccountService> in
                let url = target.baseURL.appendingPathComponent(target.path).absoluteString
                let endpoint = Endpoint<AccountService>(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 = MoyaProvider(endpointClosure: publicParamEndpointClosure)

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

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

    • AccessTokenPlugin 管理AccessToken的插件
    • CredentialsPlugin 管理认证的插件
    • NetworkActivityPlugin 管理网络状态的插件
    • NetworkLoggerPlugin 管理网络log的插件

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

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

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

    let provider = MoyaProvider<AccountService>(plugins: [networkPlugin])

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

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

    (四)设置接口的超时时间

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

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

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

    let provider = MoyaProvider<AccountService>(requestClosure: requestTimeoutClosure)

      至此,使用Moya进行网络请求的基本用法已经介绍完了,主要是记录一下只是药店,当然也希望能对大家有点用处,谢谢!

    资料参考:

    http://www.jianshu.com/p/38fbc22a1e2b

    https://github.com/Moya/Moya

  • 相关阅读:
    Python004-数据处理示例:以某个数据(字段)为基准从数据中获取不同的字段行数
    VUE-004-禁止修改页面显示项,设置el-input,textarea只读方法
    VUE-003-前端表格数据展示时,设置单元格(el-table-column)保留空格和换行
    cobaltstrike4.0 cracked
    CobaltStrike3.14破解
    CobaltStrike3.12/13 破解
    Windows 10 Manager v2.3.3
    MobaXterm v10.9破解
    Jupyter/JupyterLab安装使用
    WordPress <= 4.6 命令执行漏洞(PHPMailer)复现分析
  • 原文地址:https://www.cnblogs.com/jadonblog/p/6945974.html
Copyright © 2020-2023  润新知