本文主要是練習Moya的熟練使用(Swift4.0)
一 正常導入,CocoaPods
platform :ios, ’8.0’ use_frameworks! pod 'Moya'
二 網絡請求基本使用
1.主要是對TargetType這個約定進行實現
先看看源碼
/// The protocol used to define the specifications necessary for a `MoyaProvider`. public protocol TargetType { /// The target's base `URL`. var baseURL: URL { get } /// The path to be appended to `baseURL` to form the full `URL`. var path: String { get } /// The HTTP method used in the request. var method: Moya.Method { get } /// Provides stub data for use in testing. var sampleData: Data { get } /// The type of HTTP task to be performed. var task: Task { get } /// Whether or not to perform Alamofire validation. Defaults to `false`. var validate: Bool { get } /// The headers to be used in the request. var headers: [String: String]? { get } }
2.創建接口
///創建一個登陸接口(枚舉) public enum TestHttp{ case login(account:String,password:String)
}
3.用這個枚舉extension TargetType
extension TestHttp:TargetType{ //請求URL public var baseURL:URL{ return URL(string:"http://www.baidu.com")! } //詳細的路徑(例如/login) public var path: String { switch self { case .login(_,_): return "/login" } } ///請求方式 public var method:Moya.Method { switch self { case .login(_,_): return .get } } ///單元測試用 public var sampleData:Data{ return "".data(using:.utf8)! } ///任務 public var task: Task { switch self { case let .login(account,password): return .requestParameters(parameters:["account":account,"password": password], encoding: URLEncoding.default) } } ///請求頭信息 public var headers: [String : String]? { return nil }
4.寫一個公共網絡請求調用的class(可以實現網絡請求文件分離,像我就是按功能分離的)下面會有有使用介紹
import Foundation import Moya import Result import ObjectMapper import SwiftyJSON ///成功 typealias SuccessStringClosure = (_ result: String) -> Void typealias SuccessModelClosure = (_ result: Mappable?) -> Void typealias SuccessArrModelClosure = (_ result: [Mappable]?) -> Void typealias SuccessJSONClosure = (_ result:JSON) -> Void /// 失敗 typealias FailClosure = (_ errorMsg: String?) -> Void /// 網絡請求 public class PHMoyaHttp{ /// 共享實例 static let shared = PHMoyaHttp() private init(){} private let failInfo="數據解析失敗" /// 請求JSON數據 func requestDataWithTargetJSON<T:TargetType>(target:T,successClosure:@escaping SuccessJSONClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let mapjson = try response.mapJSON() let json=JSON(mapjson) successClosure(json) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } } /// 請求數組對象JSON數據 func requestDataWithTargetArrModelJSON<T:TargetType,M:Mappable>(target:T,model:M,successClosure:@escaping SuccessArrModelClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let json = try response.mapJSON() let arr=Mapper<M>().mapArray(JSONObject:JSON(json).object) successClosure(arr) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } } /// 請求對象JSON數據 func requestDataWithTargetModelJSON<T:TargetType,M:Mappable>(target:T,model:M,successClosure:@escaping SuccessModelClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let json = try response.mapJSON() let model=Mapper<M>().map(JSONObject:JSON(json).object) successClosure(model) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } } ///請求String數據 func requestDataWithTargetString<T:TargetType>(target:T,successClosure:@escaping SuccessStringClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let str = try response.mapString() successClosure(str) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } }//設置一個公共請求超時時間 private func requestTimeoutClosure<T:TargetType>(target:T) -> MoyaProvider<T>.RequestClosure{ let requestTimeoutClosure = { (endpoint:Endpoint<T>, done: @escaping MoyaProvider<T>.RequestResultClosure) in do{ var request = try endpoint.urlRequest() request.timeoutInterval = 20 //設置請求超時時間 done(.success(request)) }catch{ return } } return requestTimeoutClosure } }
5.調用網絡請求
PHMoyaHttp.shared.requestDataWithTargetJSON(target:TestHttp.login(account:"account", password:"password"), successClosure: { (json) in print(json) }) { (error) in print(error) } }
///如果再有其他文件請求(例如首頁數據請求)一般接口比較多可以單獨一個文件
///創建一個接口
public enum RequestIndexHttp{
///寫一個沒有參數的
case requestIndex()
}
extension RequestIndexHttp:TargetType{
//請求URL
public var baseURL:URL{ return URL(string:"http://www.baidu.com")! } //詳細的路徑 public var path: String { switch self { case .requestIndex(): return "/index" } } ///請求方式 public var method:Moya.Method { switch self { case .requestIndex(): return .get } } ///單元測試用 public var sampleData:Data{ return "".data(using:.utf8)! } ///任務 public var task: Task { switch self { case .requestIndex(): return .requestPlain
} } ///請求頭信息 public var headers: [String : String]? { return nil }
///調用
PHMoyaHttp.shared.requestDataWithTargetJSON(target:RequestIndexHttp.requestIndex(), successClosure: { (json) in
print(json) }) { (error) in print(error) } }
///TestStoreGoodEntity()是你extension Mappable的類或者結構
PHMoyaHttp.sharedInstance.requestDataWithTargetArrModelJSON(target:RequestIndexHttp.requestIndex(), model:TestStoreGoodEntity(), successClosure: { (arr) in
print(arr)
}) { (error) in
print(error)
}
第一次寫博客 寫的不好請多多指教