1. 程式人生 > >Swift網絡請求(Moya篇)

Swift網絡請求(Moya篇)

man auto https cap 分享 nco icp blank utc

  在使用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 {
        switch
self { 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篇)