【实践】在swift中使用枚举统一管理项目Api

之前在android项目的retrofit框架中,会单独写一个接口类统一管理项目api,这样在之后对项目做维护时会特别方便。
但之前在写iOS项目时,会傻傻的会写一个接口管理类,每个接口都封装到一个方法里,每新增一个接口时就要新写一个方法,往往导致这个接口类冗长臃肿,维护起来特别费劲。
接之前文章https://www.jianshu.com/p/eec45f42580d会把发送请求封装到一个方法里,请求API在发送请求时传入方法,这样会导致全局的api会散落在项目的各个地方,之后查找维护起来也是费劲。
so...这里尝试使用枚举把项目总体的api封装一下。有不足不妥之处,请指正。

1.封装api结构体BaseApi,并实现 ExpressibleByStringLiteral 和 Equatable 协议,ExpressibleByStringLiteral是为了使用字符串直接初始化,Equatable是为了之后封装枚举。

//MARK: - 声明请求API结构体,包含请求地址和请求名称
public struct BaseApi : ExpressibleByStringLiteral , Equatable{

private let apiURL: String

public init(stringLiteral apiStr: String) {
    self.init(apiStr)
}

init(_ apiURL:String) {
    self.apiURL = apiURL
}

public static func ==  (lhs: BaseApi, rhs: BaseApi) -> Bool{
    if lhs.apiURL == rhs.apiURL{
        return true
    }
    return false
}

  /**
 * 获取格式化的信用api
 */
public func getCreditApiURL() -> String{
    return BASE_CREDIT_DOMAIN + self.apiURL + "?t=" + String(Int(Date().timeIntervalSince1970))
}
}

2.封装枚举

public let BASE_SHOP_DOMAIN = "https://xxx.xxx.xxx"

//MARK:商城API
public enum ShoppingApi : BaseApi{
  //MARK: 会员-登录
  case login = "/api/login"

  //MARK: 会员-登出
  case logout = "/api/logout"
}

//MARK : 平台API
public enum CommonApi : BaseApi{
  //MARK: 平台数据汇总
  case codeListMaster = "/api/listCodeMasterMain"

  //MARK: 系统配置获取
  case getSystemConfig = "/api/getSystemConfig"
}

3.发送请求

var paramters = [String : String]()
paramters["name"] = "xxx"
paramters["password"] = "xxx"

NetServiceProvider.sharedInstance.sendNetworkRequest(paramters, requestApi: ShoppingApi.login.rawValue) { (response:BaseResponseModel, error) in
        ALinLog(response)
}

4.执行请求方法

/// 电商模块网络请求方法
///
/// - parameter paramters:     参数
/// - parameter requestApi:    接口Api
/// - parameter finished:      闭包
///
func sendNetworkRequest(_ paramters: [String : String],
                                     jsonParamArra : [(String,JSON)] = [],
                                     requestApi:BaseApi,
                                     finished:@escaping (_ responseModel: T,_ error: NetError?)->())
{
    
    //1.create a request
    var request = URLRequest(url:URL(string:requestApi.getShoppingApiURL())!)
    
    //2.set request method
    request.httpMethod = HTTPMethod.post.rawValue
    
    //3.set content-type
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("xxx", forHTTPHeaderField: "xxx")
    
    //4.create and put data to HttpBody
    let requestParam = getBaseParamters(paramters,jsonParamArra: jsonParamArra)
    let originData = (requestParam.data(using: .utf8))! as Data
    request.httpBody = originData
    
    //5.start
    Alamofire.request(request).responseString { response in
        if response.result.isSuccess{
            do{
                let json = try JSON(data: response.data!)
                
                if let responseObject = T.deserialize(from: json.description) {
                    finished(responseObject,nil)
                }else{
                    finished(T(),NetError.Deserialize_Error)
                }
            }catch{
                finished(T(),NetError.Deserialize_Error)
            }
        }else{
            finished(T(),NetError.Server_Error)
        }
    }
}

【关注公众号 发现更多精彩】

你可能感兴趣的:(【实践】在swift中使用枚举统一管理项目Api)