本文主要是练习Moya的熟练使用(Swift4.0)
一 正常导入,CocoaPods
platform :ios, ’8.0’ use_frameworks! pod 'Moya'
二 网络请求基本使用
1.主要是对TargetType这个约定进行实现
先看看源码
/// The protocol used to define the specifications necessary for a `MoyaProvider`. public protocol TargetType { /// The target's base `URL`. var baseURL: URL { get } /// The path to be appended to `baseURL` to form the full `URL`. var path: String { get } /// The HTTP method used in the request. var method: Moya.Method { get } /// Provides stub data for use in testing. var sampleData: Data { get } /// The type of HTTP task to be performed. var task: Task { get } /// Whether or not to perform Alamofire validation. Defaults to `false`. var validate: Bool { get } /// The headers to be used in the request. var headers: [String: String]? { get } }
2.创建接口
///创建一个登陆接口(枚举) public enum TestHttp{ case login(account:String,password:String)
}
3.用这个枚举extension TargetType
extension TestHttp:TargetType{ //请求URL public var baseURL:URL{ return URL(string:"http://www.baidu.com")! } //详细的路径(例如/login) public var path: String { switch self { case .login(_,_): return "/login" } } ///请求方式 public var method:Moya.Method { switch self { case .login(_,_): return .get } } ///单元测试用 public var sampleData:Data{ return "".data(using:.utf8)! } ///任务 public var task: Task { switch self { case let .login(account,password): return .requestParameters(parameters:["account":account,"password": password], encoding: URLEncoding.default) } } ///请求头信息 public var headers: [String : String]? { return nil }
4.写一个公共网络请求调用的class(可以实现网络请求文件分离,像我就是按功能分离的)下面会有有使用介绍
import Foundation import Moya import Result import ObjectMapper import SwiftyJSON ///成功 typealias SuccessStringClosure = (_ result: String) -> Void typealias SuccessModelClosure = (_ result: Mappable?) -> Void typealias SuccessArrModelClosure = (_ result: [Mappable]?) -> Void typealias SuccessJSONClosure = (_ result:JSON) -> Void /// 失败 typealias FailClosure = (_ errorMsg: String?) -> Void /// 网络请求 public class PHMoyaHttp{ /// 共享实例 static let shared = PHMoyaHttp() private init(){} private let failInfo="数据解析失败" /// 请求JSON数据 func requestDataWithTargetJSON<T:TargetType>(target:T,successClosure:@escaping SuccessJSONClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let mapjson = try response.mapJSON() let json=JSON(mapjson) successClosure(json) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } } /// 请求数组对象JSON数据 func requestDataWithTargetArrModelJSON<T:TargetType,M:Mappable>(target:T,model:M,successClosure:@escaping SuccessArrModelClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let json = try response.mapJSON() let arr=Mapper<M>().mapArray(JSONObject:JSON(json).object) successClosure(arr) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } } /// 请求对象JSON数据 func requestDataWithTargetModelJSON<T:TargetType,M:Mappable>(target:T,model:M,successClosure:@escaping SuccessModelClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let json = try response.mapJSON() let model=Mapper<M>().map(JSONObject:JSON(json).object) successClosure(model) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } } ///请求String数据 func requestDataWithTargetString<T:TargetType>(target:T,successClosure:@escaping SuccessStringClosure,failClosure: @escaping FailClosure) { let requestProvider = MoyaProvider<T>(requestClosure:requestTimeoutClosure(target: target)) let _=requestProvider.request(target) { (result) -> () in switch result{ case let .success(response): do { let str = try response.mapString() successClosure(str) } catch { failClosure(self.failInfo) } case let .failure(error): failClosure(error.errorDescription) } } }//设置一个公共请求超时时间 private func requestTimeoutClosure<T:TargetType>(target:T) -> MoyaProvider<T>.RequestClosure{ let requestTimeoutClosure = { (endpoint:Endpoint<T>, done: @escaping MoyaProvider<T>.RequestResultClosure) in do{ var request = try endpoint.urlRequest() request.timeoutInterval = 20 //设置请求超时时间 done(.success(request)) }catch{ return } } return requestTimeoutClosure } }
5.调用网络请求
PHMoyaHttp.shared.requestDataWithTargetJSON(target:TestHttp.login(account:"account", password:"password"), successClosure: { (json) in print(json) }) { (error) in print(error) } }
///如果再有其他文件请求(例如首页数据请求)一般接口比较多可以单独一个文件
///创建一个接口
public enum RequestIndexHttp{
///写一个没有参数的
case requestIndex()
}
extension RequestIndexHttp:TargetType{
//请求URL
public var baseURL:URL{ return URL(string:"http://www.baidu.com")! } //详细的路径 public var path: String { switch self { case .requestIndex(): return "/index" } } ///请求方式 public var method:Moya.Method { switch self { case .requestIndex(): return .get } } ///单元测试用 public var sampleData:Data{ return "".data(using:.utf8)! } ///任务 public var task: Task { switch self { case .requestIndex(): return .requestPlain
} } ///请求头信息 public var headers: [String : String]? { return nil }
///调用
PHMoyaHttp.shared.requestDataWithTargetJSON(target:RequestIndexHttp.requestIndex(), successClosure: { (json) in
print(json) }) { (error) in print(error) } }
///TestStoreGoodEntity()是你extension Mappable的类或者结构
PHMoyaHttp.sharedInstance.requestDataWithTargetArrModelJSON(target:RequestIndexHttp.requestIndex(), model:TestStoreGoodEntity(), successClosure: { (arr) in
print(arr)
}) { (error) in
print(error)
}
第一次写博客 写的不好请多多指教