Swift網路請求(Moya篇)

來源:互聯網
上載者:User

標籤:code   plugins   介面   lan   form   nslog   task   custom   發送   

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.