之前在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<T:HandyJSON>(_ 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)
}
}
}

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