前言:
Alamofire是一個(gè)使用Swift開(kāi)發(fā)的網(wǎng)絡(luò)請(qǐng)求庫(kù),其開(kāi)發(fā)團(tuán)隊(duì)是AFNetworking的原團(tuán)隊(duì)。它語(yǔ)法簡(jiǎn)潔,采用鏈?zhǔn)骄幊?/code>的思想捅暴,本質(zhì)是基于
NSURLSession
進(jìn)行封裝。在此基礎(chǔ)上,答主再次封裝成了一個(gè)可以便捷使用的工具類,實(shí)現(xiàn)了鏈?zhǔn)秸{(diào)用
以及OC風(fēng)格調(diào)用
兩種調(diào)用方式皆尔。
依賴:Alamofire5.4.4,HandyJSON
正文:
- 根據(jù)后臺(tái)返回?cái)?shù)據(jù)格式定義
BaseModel
币励,便于在接收到后臺(tái)返回?cái)?shù)據(jù)后慷蠕,能夠?qū)?shù)據(jù)進(jìn)行初步處理,比如404食呻、token失效等...
import HandyJSON
class BaseModel: HandyJSON {
required init() {}
///數(shù)據(jù)
var data: Any?
/// status信息
var status: StatusModel?
}
/// status模型
struct StatusModel: HandyJSON {
var code: String? // 此處可以根據(jù)后臺(tái)返回自定義
var errorCode: String? // 錯(cuò)誤碼
var errorDescription: String? // 錯(cuò)誤描述文字
}
-
BaseModel
建立以后流炕,就可以正式開(kāi)始準(zhǔn)備搭建網(wǎng)絡(luò)請(qǐng)求工具類了。
- 請(qǐng)求成功/失敗的閉包
typealias SuccessHandlerType = ((NSDictionary) -> Void)
typealias FailureHandlerType = ((Any?, String) ->Void)
- 私有參數(shù)
private var requestType: HTTPMethod = .post // 請(qǐng)求類型
private var url: String? // URL
private var params: [String: Any]? // 參數(shù)
private var hintText: String? // 提示語(yǔ)
private var success: SuccessHandlerType? // 成功的回調(diào)
private var failure: FailureHandlerType? // 失敗的回調(diào)
private var httpRequest: Request?
private var headers: HTTPHeaders? // headers設(shè)置
- 實(shí)現(xiàn)鏈?zhǔn)秸Z(yǔ)法
///設(shè)置url
func url(_ url: String?) -> Self {
self.url = url ?? ""
return self
}
/// 設(shè)置post/get 默認(rèn)post
func requestType(_ type: HTTPMethod) -> Self {
self.requestType = type
return self
}
/// 設(shè)置參數(shù)
func params(_ params: [String: Any]?) -> Self {
self.params = params
return self
}
/// 成功的回調(diào)
func success(_ handler: @escaping SuccessHandlerType) -> Self {
self.success = handler
return self
}
只寫了部分仅胞,詳細(xì)代碼底部有Demo...
- 定義發(fā)起請(qǐng)求方法
request()
注意:
request()
方法要在鏈?zhǔn)秸Z(yǔ)法的最后調(diào)用
///發(fā)起請(qǐng)求 設(shè)置好相關(guān)參數(shù)后再調(diào)用
func request() -> Void {
var dataRequest: DataRequest? // alamofire請(qǐng)求后的返回值
//發(fā)起請(qǐng)求
if let URLString = url {
// 提示語(yǔ)句
if let hint = hintText {
// HUDTool.showLoading(hint)
}
// headers處理
var requestHeaders = HTTPHeaders()
if let header = headers {
requestHeaders = header
} else {
// 否則取默認(rèn)值
requestHeaders.add(name: "Content-Type", value: "application/json;charset=utf-8")
requestHeaders.add(name: "Accept", value: "application/json")
}
//發(fā)起網(wǎng)絡(luò)請(qǐng)求
AF.sessionConfiguration.timeoutIntervalForRequest = 60
dataRequest = AF.request(URLString,
method: requestType,
parameters: params,
encoding: URLEncoding.default,
headers: requestHeaders,
interceptor: nil,
requestModifier: nil).validate()
httpRequest = dataRequest
}
// 處理返回?cái)?shù)據(jù)
dataRequest?.responseJSON { (response) in
// 如果有返回值
guard let data = response.value else {
self.hideHUD()
if let failureBlock = self.failure {
failureBlock(response.error?.responseCode,
response.error?.localizedDescription ?? "出現(xiàn)了點(diǎn)反常的狀況每辟,請(qǐng)檢查網(wǎng)絡(luò)后再試。")
}
return
}
switch response.result {
case .success(_):
// ***********這里可以統(tǒng)一處理錯(cuò)誤碼干旧,統(tǒng)一彈出錯(cuò)誤 ****
guard let baseModel = BaseModel.deserialize(from: data as? NSDictionary)
else {
if let failureBlock = self.failure {
failureBlock(response.error?.responseCode,
"出現(xiàn)了點(diǎn)反常的狀況影兽,請(qǐng)檢查網(wǎng)絡(luò)后再試。")
}
return
}
// 成功
if let successBlock = self.success {
successBlock(baseModel.data as! NSDictionary)
}
case let .failure(error):
self.hideHUD()
if let failureBlack = self.failure {
failureBlack(nil, error.localizedDescription)
}
}
}
- 如何調(diào)用莱革。
Network()
.requestType(.post)
.url("")
.params(nil)
.headers(nil)
.hintText("加載中")
.success { data in
}.failure { code, message in
}.request()
關(guān)于類似OC的學(xué)法:
這里就不一一贅述了,底部的Demo地址中有詳細(xì)的代碼讹开。盅视。