美文网首页
Alamofire的封装

Alamofire的封装

作者: StoneWing | 来源:发表于2017-06-08 17:59 被阅读414次

    最近在重写之前的一个项目,使用swift3.0的环境,网络请求的框架使用Alamofire,所以对Alamofire进行了一个简单的分装,可以支持rxswift,模仿moya

    由于我们的项目接口,大量的接口都是传递的xml文本的参数,所以有一个直接传递参数问xml文本的方法,不需要的话,可以直接删除掉

    • targetType协议

     //接口相关配置
     public protocol TargetType {
           // 接口地址,不包括域名
           var url: String {get}
           // 接口参数--xml文本参数
           var xml: String {get}
           // 接口参数--字典参数
           var param: [String:Any] {get}
           var method: Method {get}
           // 是否显示hud提示框
           var hud: Bool {get}
          }
    
      // MARK: - 接口的扩展,默认post,显示hud
    extension TargetType 
        public var method: Method {
            return Method.post
        }
        public var hud: Bool {
            return true
        }
    }
    
    • RequestClient协议

    /// 域名
        var host: String { get }
        
        /// rx---Almofire封装--传递xml字符串
        ///
        /// - Parameters:
        ///   - r: 接口需要的相关信息
        ///   - Success: 成功的回调
        ///   - Failure: 失败的回调
        func rx_RequestXML<T: TargetType>(_ r: T) -> Observable<Data>
        
        /// rx---Almofire封装--传递json
        ///
        /// - Parameters:
        ///   - r: 接口需要的相关信息
        ///   - Success: 成功的回调
        ///   - Failure: 失败的回调
        func rx_RequestParam<T: TargetType>(_ r: T) -> Observable<Data>
        
        /// Almofire封装--传递xml字符串
        ///
        /// - Parameters:
        ///   - r: 接口需要的相关信息
        ///   - Success: 成功的回调
        ///   - Failure: 失败的回调
        func requestXML<T: TargetType>(_ r: T,
                        Success: @escaping(_ response: Any) -> (),
                        Failure: @escaping(_ error: Error) -> ())
        
        /// Almofire封装--传递json
        ///
        /// - Parameters:
        ///   - r: 接口需要的相关信息
        ///   - Success: 成功的回调
        ///   - Failure: 失败的回调
        func requestParam<T: TargetType>(_ r: T,
                          Success: @escaping(_ response: Any) -> (),
                          Failure: @escaping(_ error: Error) -> ())
    
    • ALTools 实现RequestClient协议,这里给出rx_xml参数和字典参数的方法,方法里面的jsonformat是自己根据项目需要封装的一个格式化json格式的方法

    
          // Almofire封装类
          public struct ALTools: RequestClient {
                 var host: String {
                       return SERVER
          }
           /// rx---Almofire封装--传递json
          /// - Parameter r: 接口需要的相关信息
          /// - Returns: 二进制data
          internal func rx_RequestParam<T : TargetType>(_ r: T) -> Observable<Data> {
         
            ....
          }
          /// rx---Almofire封装方法---传递xml字符串
          /// - Parameter r: 接口需要的相关信息
          /// - Returns: 二进制data
          internal func rx_RequestXML<T : TargetType>(_ r: T) -> Observable<Data> {
            
            if r.hud {
                SVProgressHUD.show()
            }
            return Observable.create({ (observer) -> Disposable in
                
                var request = URLRequest(url: URL(string: "\(self.host)\(r.url)")!)
                request.httpMethod = r.method.rawValue
                let data = r.xml.data(using: String.Encoding.utf8)
                request.httpBody = data
                request.setValue("text/xml", forHTTPHeaderField: "Content-Type")
                Alamofire.request(request).responseData { (response) in
                    if let data = response.data {
                    
                        if r.hud {
                            SVProgressHUD.dismiss()
                        }
                        
                        if data.jsonFormat != nil {
                            observer.onNext(data)
                            observer.onCompleted()
                        }else {
                            SVProgressHUD.showError(withStatus: "服务器获取数据失败,请稍后再试")
                            SVProgressHUD.dismiss(withDelay: DISMISSTIME)
                            observer.onCompleted()
                        }
                    }else {
                        SVProgressHUD.showError(withStatus: response.error?.localizedDescription)
                        SVProgressHUD.dismiss(withDelay: DISMISSTIME)
                        observer.onError(response.error!)
                    }
                }
                return Disposables.create {
                    
                }
            })
          }
    
          /// Almofire封装--传递json
          ///
          /// - Parameters:
          ///   - r: 接口需要的相关信息
          ///   - Success: 成功的回调
          ///   - Failure: 失败的回调
          internal func requestParam<T : TargetType>(_ r: T, Success: @escaping (Any) -> (), Failure: @escaping (Error) -> ()) {
            
            if r.hud {
                SVProgressHUD.show()
            }
            
            Alamofire.request(URL(string: "\(self.host)\(r.url)")!, method: r.method, parameters: r.param).responseData {
                (response) in
                if let data = response.data, let result =  String(data: data, encoding: .utf8) {
                    SLLog(message: result)
                    SVProgressHUD.dismiss()
                    Success(data)
                }else {
                    SVProgressHUD.showError(withStatus: response.error?.localizedDescription)
                    Failure(response.error!)
                }
            }
          }
        
          /// Almofire封装--传递xml字符串
          ///
          /// - Parameters:
          ///   - r: 接口需要的相关信息
          ///   - Success: 成功的回调
          ///   - Failure: 失败的回调
          internal func requestXML<T : TargetType>(_ r: T, Success: @escaping (Any) -> (), Failure: @escaping (Error) -> ()) {
          ....
        }
        
      }
    

    • 使用
    
      struct loginApi: TargetType {
            var url: String {
                     return loginASHX
            }
            var param: [String:Any] {
            switch self {
            case .login(let phone, let pwd):
                return ["t":2, "tel":phone, "pwd":pwd]
            }
          }
        
            var xml: String {
            //一个字典转xml的方法
            return XMLTool.shareInstance.getXML(withParam: param, isChannel: true)
          }
      }
    
      //调用
    ALTools().rx_RequestXML(loginApi)....
    

    相关文章

      网友评论

          本文标题:Alamofire的封装

          本文链接:https://www.haomeiwen.com/subject/njetqxtx.html