Swift網絡請求(Moya篇)
在使用Alamofire進行網絡請求的時候,相信大部分的同學都會封裝一個抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等。但是位置業務功能增加,會漸漸混合各種請求,不夠清晰,而Moya能很好地解決這類問題。Moya在Alamofire基礎上進行封裝,是一個允許高度自定義的網絡層,可以根據具體的需求進行接口的設置。具體的介紹可以參考Moya的官方鏈接,結構圖如下:
接下來就介紹一下Moya的一些常見的用法:
(一)根據業務需求創建具體請求:
打比方現在我們需要書寫賬戶的相關接口,如Login、userInfo。那麽首先我們得創建AccountService:
enum AccountService { case login(phoneNum: NSInteger,passWord: NSInteger) case logout }
然後讓AccountService實現TargetType協議,定義請求需要的基本信息:
extension AccountService: TargetType { var baseURL: URL { return URL(string: ServiceBaseURL)! } var path: String { switchself { case .login(_, _): return "accountService/login" case .logout: return "accountService/logout" } } var method: Moya.Method { switch self { case .login(_, _): return .post case .logout: return.get } } var parameters: [String: Any]? { switch self { case .login(let phoneNum, let passWord): return ["phoneNum": phoneNum, "passWord": passWord] case .logout: return nil } } var parameterEncoding: ParameterEncoding { return JSONEncoding.default // Send parameters as JSON in request body } var sampleData: Data { return "".data(using: .utf8)! } var task: Task { return .request } }
如上我們就已經完成了網絡請求所需要的一個endpoint
。接著通過Moya提供一個發送請求的Provider就完成了基本的使用:
let provider = MoyaProvider<AccountService>()
provider.request(.login(phoneNum: 12345678901, passWord: 123456)) { result in
switch result {
case let .success(response):
//...............
break
case let .failure(error):
//...............
break
}
}
(二)通過HTTPHeader設置公共請求參數
在實際開發中我們可能會需要在請求頭內添加一些公共請求參數,如用於識別一些平臺標誌、辨別接口的版本號。你可以定義一個Endpoint的閉包,
let publicParamEndpointClosure = { (target: AccountService) -> Endpoint<AccountService> in let url = target.baseURL.appendingPathComponent(target.path).absoluteString let endpoint = Endpoint<AccountService>(url: url, sampleResponseClosure: { .networkResponse(200, target.sampleData) }, method: target.method, parameters: target.parameters, parameterEncoding: target.parameterEncoding) return endpoint.adding(newHTTPHeaderFields: ["x-platform" : "iOS", "x-interface-version" : "1.0"]) }
然後在創建請求的Provider把它添加上去,
let provider = MoyaProvider(endpointClosure: publicParamEndpointClosure)
(三)通過插件的方式監聽網絡狀態
通常我們會在進行網絡請求的時候進行一些狀態展示,如loading,那麽你可以通過插件的方式來實現。Moya默認有4個插件:
- AccessTokenPlugin 管理AccessToken的插件
- CredentialsPlugin 管理認證的插件
- NetworkActivityPlugin 管理網絡狀態的插件
- NetworkLoggerPlugin 管理網絡log的插件
在這裏就演示一下NetworkActivityPlugin的使用:
let networkPlugin = NetworkActivityPlugin { (type) in switch type { case .began: NSLog("顯示loading") case .ended: NSLog("隱藏loading") } }
同樣在創建請求的Provider把它添加上去即可
let provider = MoyaProvider<AccountService>(plugins: [networkPlugin])
當然你也可以自定義一些功能的插件,只需要實現PluginType協議,具體功能實現可參考Moya默認的插件:
final class CustomPlugin: PluginType { // MARK: Plugin }
(四)設置接口的超時時間
一般網絡的請求需要根據具體的業務接口設置合適的超時時間,你可以參照一下方法進行設置,
let requestTimeoutClosure = { (endpoint: Endpoint<AccountService>, done: @escaping MoyaProvider<AccountService>.RequestResultClosure) in guard var request = endpoint.urlRequest else { return } request.timeoutInterval = 30 //設置請求超時時間 done(.success(request)) }
同樣在創建請求的Provider把它添加上去即可
let provider = MoyaProvider<AccountService>(requestClosure: requestTimeoutClosure)
至此,使用Moya進行網絡請求的基本用法已經介紹完了,主要是記錄一下只是藥店,當然也希望能對大家有點用處,謝謝!
資料參考:
http://www.jianshu.com/p/38fbc22a1e2b
https://github.com/Moya/Moya
Swift網絡請求(Moya篇)