Moya基本用法

本文介绍如何通过Moya简化Alamofire的使用,包括定义接口枚举、实现TargetType协议、自定义超时时间及错误处理等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Moya简介

一句话来讲,Moya是对Alamofire的封装,让开发人员更加优雅的使用Alamofire。

基本用法

  1. 定义接口枚举

    public enum HFAPI {
        case login(String, String, String) //登录接口
        case smscode(String)    //登录,发送验证码
    }
    复制代码
  2. 拓展枚举并实现TargetType,代码详解如下:

    extension HFAPI: TargetType {
        
        public var baseURL: URL {
            return URL.init(string: "接口域名")!;
        }
        
        public var path: String {
            switch self {
            case .login:
                return "login接口路径"
            case .smscode:
                return "smscode接口路径"
            }
        }
        
        //请求接口时使用的方法
        public var method: Moya.Method {
            switch self {
            case .login:
                return .post
            case .smscode:
                return .get
            }
        }
        
     	//请求接口时对应的请求参数
        public var task: Task {
            var params:[String : Any] = [:]
            
            params["v"] = ProjectInfo.appVersionWithOutPoint()
            params["dev"] = ProjectInfo.platform()
            switch self {
                case.login(let smsCodeToken, let smsCode, let phone):
                    params["smsCodeToken"] = smsCodeToken
                    params["smsCode"] = smsCode
                    params["phone"] = phone
                    break;
                case .smscode(let phone):
                    params["phone"] = phone
                    break;
            }
            return .requestParameters(parameters: params, encoding: URLEncoding.default)
        }
        
        //header信息
        public var headers: [String : String]? {
            var header: [String:String] = [:]
            let token = HFDefault.getToken()
            if token.count > 0 {
                header["X-Token"] = token
            }
            return header
        }
        
        //用于单元测试
        public var sampleData: Data {
            switch self {
            case .login:
                return "{\"id\": \"1\", \"first_name\": \"Harry\", \"last_name\": \"Potter\"}".data(using: String.Encoding.utf8)!
            default:
                return Data()
            }
        }
    }
    复制代码

    sampleData是用于单元测试的,我们可以使用Xcode自带的单元测试工具来自测,测试用例如下:

    func testSmscodeAPI() {
            let loginProvitder = MoyaProvider<HFAPI>(stubClosure: MoyaProvider.immediatelyStub)
            loginProvitder.request(.smscode("17755558888")) { result in
                switch result {
                case let .success(moyaResponse):
                    let statusCode = moyaResponse.statusCode // Int - 200, 401, 500, etc
                    let data = String.init(data: moyaResponse.data, encoding: String.Encoding.utf8)
                    print("\(statusCode)")
                    print(data ?? "no data")
                case .failure(_):
                    break
                }
            }
        }
    复制代码
  3. 自定义超时时间

     public static func hFApiProvider(timeInterval:TimeInterval  = 15) -> MoyaProvider<HFAPI> {
            return MoyaProvider<HFAPI>(
                requestClosure: { (endPoint, closure) in
                    do {
                        var urlRequest = try endPoint.urlRequest()
                        urlRequest.timeoutInterval = timeInterval;
                        closure(.success(urlRequest))
                    } catch MoyaError.requestMapping(let url) {
                        closure(.failure(MoyaError.requestMapping(url)))
                    } catch MoyaError.parameterEncoding(let error) {
                        closure(.failure(MoyaError.parameterEncoding(error)))
                    } catch {
                        closure(.failure(MoyaError.underlying(error, nil)))
                    }
            })
        }
    复制代码
  4. 错误处理

    struct HFNetWork {
        
        public static func request(provider: MoyaProvider<HFAPI>,
                            target: HFAPI,
                            success successCallback: @escaping (JSON) -> Void,
                            error errorCallback: @escaping (Int) -> Void,
                            failure failureCallback: @escaping (MoyaError) -> Void) {
            provider.request(target) { result in
                switch result {
                case let .success(response):
                    do {
                        let json = try JSON(response.filterSuccessfulStatusCodes().mapJSON())
                        successCallback(json)
                    }
                    catch let error {
                        errorCallback((error as! MoyaError).response!.statusCode)
                    }
                case let .failure(error):
                    failureCallback(error)
                }
            }
        }
    }
    复制代码
  5. 调用

    HFNetWork.request(provider: HFAPI.hFApiProvider(), target: .smscode(phone), success: { (json) in
                let jsonString = json.rawString() ?? ""
                if jsonString.count <= 0 {
                    return
                }
                let responseObject = ResponseModel(JSONString: jsonString)
                guard let fResponseObject = responseObject else {
                    return
                }
                
                HFLog.info(fResponseObject.data)
            }, error: { (errorcode) in
            }) { (error) in
            }
    }
    复制代码
03-28
本系统是支持短信业务的应用服务器软件(类似tomcat),按照servlet规范开发而成,具有良好的扩展性和夸平台性。具有Session功能,各产品的 session可设置单独的超时时间,业务适应范围相当广泛,例如:包月群发类、媒体互动类、游戏互动类、聊天类等等。系统具有一套定义良好的接口,用户可以灵活扩展,各系统模块的加载完全由配置来决定,当加入新的模块时只需修改配置文件即可,系统支持web模块,web模块由配置文件来决定是否被加载,当web模块被加载后,所有遵循servlet规范的web系统都可以在本系统中被加载,例如系统的后来管理用的就是内置的web容器。系统支持JMX的管理方式,jmx客户端都可以通过系统端口连接系统,以便对系统进行动态管理。由于系统是一个标准的servlet容器,消息的请求与应答都是标准的 ServletRequest和ServletResponse,为了能和各种短信网关(或短信平台)进行对接,系统的连接模块做了高度抽象,完全和实现脱离,所以扩展相当方便,产品开发人员完全不用理会通讯的内部细节和消息结构细节,只要专注与业务逻辑的实现就可以了。产品的开发也相当简单,如果会一点 web的话更是得心应手,开发方式和web开发完全相同。系统采用对象池技术,当产品处于非活动状态时会被系统自动清除,当有新的请求时产品会被重新加载,使系统资源得到有效的利用,也可以通过优化系统参数来优化系统的性能,即使面对高强度的消息请求系统优秀的缓冲技术可以保证系统不会崩溃。 web site:http://www.31010.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值