最開始自己也是使用Alamofire進(jìn)行網(wǎng)絡(luò)請求摧冀,后面聽說有Moya這種請求方法页眯。一下就喜歡上了。話不多說匙瘪,下面直接上代碼铆铆。
import Moya
import Result
enum API {
case login(parameters:[String: Any]) // 登錄
case getAllProjUser // 獲取用戶參與的所有項目
}
然后實現(xiàn)TargetType這個協(xié)議。Xcode會提示需要添加的代碼丹喻,點(diǎn)擊提示自動補(bǔ)全代碼薄货。這里在method會報一個錯誤。需要改成Moya.Method就OK碍论。
extension API:TargetType{
var baseURL: URL {
return URL(string: "https://www.baidu.com?search=")!
}
var path: String {
switch self {
case .login:
return "Login"
case .getAllProjUser:
return "GetAllProj"
}
}
var getPartmeters: [String: Any]{
switch self {
case let .login(dict):
return dict
case .getAllProjUser:
return [:]
}
}
var task: Task {
return .requestParameters(parameters: getPartmeters, encoding: JSONEncoding.default)
}
var method: Moya.Method {
return .post
}
var sampleData: Data {
return Data()
}
var headers: [String : String]? {
return nil
}
}
到此谅猾,API設(shè)計就完成了。下一步進(jìn)行網(wǎng)絡(luò)請求方法的代碼骑冗。
在這里赊瞬,我們設(shè)置了myEndpointClosure。主要是設(shè)置超時時間和解決URL帶有贼涩?時巧涧,無法正確的鏈接地址的bug。在沒知道這個之前遥倦,我還是通過修改源碼來解決這個問題谤绳。
import Moya
/// 超時時長
private var requestTimeOut:Double = 30
///endpointClosure
private let myEndpointClosure = { (target: API) -> Endpoint in
///主要是為了解決URL帶有占锯?無法請求正確的鏈接地址的bug
let url = target.baseURL.absoluteString + target.path
var endpoint = Endpoint(
url: url,
sampleResponseClosure: { .networkResponse(200, target.sampleData) },
method: target.method,
task: target.task,
httpHeaderFields: target.headers
)
switch target {
case .login:
requestTimeOut = 5//按照項目需求針對單個API設(shè)置不同的超時時長
return endpoint
default:
requestTimeOut = 30//設(shè)置默認(rèn)的超時時長
return endpoint
}
}
struct Network {
static let provider = MoyaProvider<API>(endpointClosure: myEndpointClosure)
static func request(_ target: API, successCallback: @escaping ([String:Any]) -> Void,
failure failureCallback: @escaping (String) -> Void){
provider.request(target) { (result) in
switch result{
case let .success(response):
if let json = try? response.mapJSON() as! [String:Any]{
successCallback(json)
}
else{
print("服務(wù)器連接成功,數(shù)據(jù)獲取失敗")
}
case let .failure(error):
failureCallback(error.errorDescription!)
}
}
}
// MARK: - 取消所有網(wǎng)絡(luò)請求
static func cancelAllRequest(){
provider.manager.session.getAllTasks { (tasks) in
tasks.forEach{
print("取消網(wǎng)絡(luò)請求一次")
$0.cancel()
}
}
}
}
下一步是使用方法,上代碼缩筛。
let parameters = ["account":account,"password":password]
Network.request(.login(parameters: parameters), successCallback: { (json) in
print(json)
}) { (msg) in
print(msg)
}
}