使用Moya创建简单的网络请求
- Moya初始化
open class MoyaProvider<Target: TargetType>: MoyaProviderType
- TargetType
public protocol TargetType
- MoyaProviderType
public protocol MoyaProviderType: AnyObject {
associatedtype Target: TargetType
/// Designated request-making method. Returns a `Cancellable` token to cancel the request later.
func request(_ target: Target, callbackQueue: DispatchQueue?, progress: Moya.ProgressBlock?, completion: @escaping Moya.Completion) -> Cancellable
}
对比OC(简单的)
如果从OC的网络请求转为swift的Moya请求.关心的几个点.
1.怎么创建请求对象
2.如何设置请求参数
3.回调事件
1. 创建一个MoyaProvider对象
- a.创建一个testType类型的对象传给MoyaProvider初始化.
- b.在touchesBegan方法中使用provider发起网络请.
2.testType类型对象
enum testType {
case demo1
case demo2(name: String)
case demo3(name: String, score: Int)
}
这里用枚举创建了几种不同的网络请求情况
扩展 testType
//通过扩展遵循协议 : 当一个类型已经符合了某个协议中的所有要求,却还没有声明遵循该协议时,可以通过空扩展体的扩展来遵循该协议:
//从现在起,targetTypeDemo的实例可以作为 TargetType 类型使用:
extension testType : TargetType {
// 请求服务器的根路径
var baseURL: URL { return URL.init(string: "https://XXXXXXX")! }
// 每个API对应的具体路径
var path: String {
switch self {
case .demo1: return "/get"
case .demo2(name: _), .demo3(name: _, score: _): return "/post"
}
}
// 各个接口的请求方式,get或post
var method: Moya.Method {
switch self {
case .demo1: return .get
case .demo2, .demo3: return .post
}
}
// 请求是否携带参数,如果需要参数,就做如demo2和demo3的设置
var task: Task {
switch self {
case .demo1: return .requestPlain // 无参数
case let .demo2(name): return .requestParameters(parameters: ["name" : name], encoding: URLEncoding.default) // 带有参数,注意前面的let
case let .demo3(name, score): return .requestParameters(parameters: ["name" : name, "score" : score], encoding: URLEncoding.default) // 带有参数,注意前面的let
}
}
// 单元测试使用
var sampleData: Data {
switch self {
case .demo1, .demo3: return "just for test".utf8Encoded
case .demo2(let name): return "{\"name\": \(name)\"}".utf8Encoded
}
}
// 请求头
var headers: [String : String]? {
return ["Content-type" : "application/json"]
}
}
3.回调事件
provider.request(testType.demo1, callbackQueue: nil, progress: { (response) in
}) { (result) in
}
PS : Moya用了很多的枚举和协议方面知识点.
参考内容:
Swift协议
Moya
Swift moya - 学习笔记
系统性学习Moya+Alamofire+RxSwift+ObjectMapper的配合使用
【iOS开发】Moya入坑记-用法解读篇
RxSwift: ReactiveX for Swift