Moya是基于Alamofire
网络框架上进行的封装,支持RXSwift
创建模型
import Foundation
/// 实用泛行实现通用格式
public struct ResponseData<T>: Codable where T: Codable {
let code: String
let message: String
let data: T?
}
public struct Post: Codable {
let id: Int
let title: String
let body: String
let userID: Int
}
extension Post {
enum CodingKeys: String, CodingKey {
case id
case title
case body
case userID = "userId" //自定义key
}
}
定义TargetType
import Moya
public enum ServerApi {
///定义请求接口参数
case getNews(channel: String, start: Int, num: Int)
case getPosts(id: Int)
}
/// 实现协议方法
extension ServerApi: TargetType {
public var baseURL: URL {
#if DEVELOP
return URL(string: "http://localhost:3000")!
#elseif PREVIEW
return URL(string: "http://localhost:3000")!
#else
return URL(string: "http://localhost:3000")!
#endif
}
/// 路径拼接
public var path: String {
switch self {
case .getNews: ///获取新闻列表
return "/getNews"
case .getPosts:
return "/posts"
}
}
///请求方式
public var method: Method {
switch self {
case .getNews:
return .post
case .getPosts:
return .get
}
}
///编码格式
public var sampleData: Data {
return "".data(using: .utf8)!
}
/// 请求任务
public var task: Task {
switch self {
case .getNews(let channel, let start, let num):
let param: [String: Any] = ["channel":channel,"start":start,"num": num]
return .requestParameters(parameters: param, encoding: URLEncoding.default)
case .getPosts(let userId):
let param: [String: Int] = ["userId":userId]
return .requestParameters(parameters: param, encoding: URLEncoding.default)
}
}
/// heder 可根据不同的接口设置不通的header
public var headers: [String : String]? {
return nil
}
}
网络请求管理
import Moya
import RxSwift
import PromiseKit
/// 服务器网络请求
public struct APIProvider<Target: TargetType> {
private let _disposeBag = DisposeBag()
///定义网络请求发起着
private let _privider = MoyaProvider<Target>(callbackQueue: .global(), session:{
() -> Session in
// 配置特殊网络需求
let serverTrustManager = APIServerTrustManager()
let interceptor = APIRequestInterceptor()
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 15 //设置请求超时时间
configuration.headers = .default
return Session(configuration: configuration,
interceptor: interceptor,
serverTrustManager: serverTrustManager,
redirectHandler: nil,
cachedResponseHandler: nil,
eventMonitors: [])
}(), plugins: [NetWorksActivityPlugin(),
NetWorksLoggerPlugin()])
/// 网络请求
///
/// - Parameters:
/// - target: API类型
/// - observeOn: 发起请求的Scheduler
/// - subscribeOn: 相应请求返回的Scheduler
/// - retryCount: 发生错误时重试次数
/// - Returns: 指定范型的Promise
public func request<T: Codable>(targetType: Target,
observeOn: ImmediateSchedulerType = ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global()),
subscribeOn: ImmediateSchedulerType = MainScheduler.instance) -> Promise<T> {
return Promise {
<