Swift 网络请求 : Moya初步认识

使用Moya创建简单的网络请求
  • Moya初始化
open class MoyaProvider: 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对象

Swift 网络请求 : Moya初步认识_第1张图片
image.png
  • 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

你可能感兴趣的:(Swift 网络请求 : Moya初步认识)