美文网首页
2018-12-10

2018-12-10

作者: 孟辉__梦笔生花 | 来源:发表于2018-12-10 17:20 被阅读6次

iNetworkgithub地址

对Alamofire进行再次封装 结合实际开发

使用

///组建请求配置 请求 解析 返回  
let _ =  iNetWork.request(API: APIStype.login(phone: "15990013156", code: "11020"))
        .responseJSON()
        .parseToObejct(type:User.self)
        .subscribe(onNext: { (user) in
           print(user)
        }, onError: { (error) in
         print(error.massage)
        })
  let _ = iNetWork.request(API: APIStype.getPhoneCode(phone: "15990013156"))
        .responseJSON()
        .parseToObejct(type: String.self)
        .subscribe { (event) in
            switch event{
            case .next( let str):
                log.info(str)
            case .completed:
                log.info("成功")
            case.error(let error):
                log.info(error)
            }
        }

接口参数配置

///。。。。。。
enum APIStype {
    //手机号登录
    case login(phone:String,code:String)

    //
    case users(userName:String)
    
    
    
    
    
    var path:String{
        get{
            switch self {
            case .login(phone: let phone, code: let code ):
              return "api/login/\(phone)/\(code)"
     
                
            case .users(let userName):
                return "users/\(userName)"
            }
        }
    }
    
    
    var params :[String:Any]{
        switch self {
        case .login(phone: let phone, code: let code ):
            return ["phone":phone,"code":code]

        case .users(_)://可以不写
           return [String:Any]()
        default:
            return [String:Any]()
        }
      
    }
  
    
    
    var  method: Alamofire.HTTPMethod{
        switch self {
        case .login(phone:_, code: _ ):
            return .post
        //case .getPhoneCode(phone: _):
            //return .get
            
        case .users(_):
            return .get
            
        default:
            return .post
        }
    }
    var hostPath:String {
        
        return "https://api.github.com/"
    }
    var urlStr:String {
        
        return hostPath + path
    }
    var url :URL{
        
            return  URL(string: urlStr)!
       
        
    }
    
}

数据返回

enum Result<T:OutfitJson> {
    case success(T)
    case failure(NetworkError)
}



/// 处理异常累
///
/// - NoNetwor: 没网络
/// - NetworkError: 网络通讯异常  包括 404...
/// - ParseFailure: 解析失败
/// - ServerError: 服务器异常  error  服务器传过来的 信息
/// - DataError: 数据异常
enum NetworkError:Error{
    case NoNetwor
    case NetworkError
    case ParseFailure
    case ServerError(error:String)
    case DataError
    var massage :String{
        get{
            switch self {
            case .NoNetwor:
                return "没网络"
            case .DataError:
                return "数据异常"
            case .ParseFailure:
                return "解析失败"
            case .ServerError(let error):
                return error;
            case .NetworkError:
                return "网络异常"
            }
        }
    }
    
}

请求和解析部分代码

struct iNetWork {
   
    //
    public static func request(API:APIStype) -> DataRequest{
      return  Alamofire.request(API.url, method:API.method, parameters:API.params)
    }
    //
    
}

extension DataRequest{
    
  
    public func responseJSON()->Observable<OutfitJson>{
        
        
        /// 根据自己的实际
        ///
        /// - Parameter response: DataResponse
        /// - Returns: 合理
        /// - Throws: 异常
        func transactionData(response:DataResponse<Any>) throws -> OutfitJson {
            if (response.result.error != nil){
                throw NetworkError.NetworkError
                
            }
            guard  let data = response.result.value else  {
                throw NetworkError.NetworkError
                
            }
            guard let dic = data as? [String:Any] else {
                throw NetworkError.DataError
                
            }
           //OutfitJson().data
            let json = OutfitJson.deserialize(from: dic)
            if (json == nil)   {
                throw NetworkError.ParseFailure
                
            }
            
             if json?.code != 2000 {
                throw NetworkError.ServerError(error: json?.massage ?? "服务器异常")
            }
            print(dic)
            return json!
            
        }
        
       return Observable<OutfitJson>.create { (o) -> Disposable in
        
        self.responseJSON(completionHandler: { (response) in
            do{
                let json = try transactionData(response: response)
                o.onNext(json)
            }catch(let error){
              o.onError(error)
            }
           
        })
        
        return  Disposables.create(with: {
            self.cancel()
        })
        
        }
        
        
      
    }
   


}

// MARK: - 解析
extension Observable where Element:OutfitJson{
   
    
    ///  单个解析
    ///
    /// - Parameter type: 类型
    /// - Returns: 解析结果
    public func parseToObejct<T:HandyJSON>(type:T.Type)  -> Observable<T>{
    
        return  self.map({ (json) -> T in
            guard let o = T.deserialize(from: json.data) else{
                throw NetworkError.ParseFailure
            }
            return o
        })
    }
    ///  数组解析
    ///
    /// - Parameter type: 类型
    /// - Returns: 解析结果 [T]
    public func parseToObejctArray<T:HandyJSON>(type:T.Type) -> Observable<[T]>{
        
        return  self.map({ (json) -> [T] in
            guard let o = [T].deserialize(from: json.data)else{
                throw NetworkError.ParseFailure
            }
            return o as! [T]
        })
    }
}

相关文章

网友评论

      本文标题:2018-12-10

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