Moya的使用


本文主要是練習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)

        }

 
 
 
        

第一次寫博客  寫的不好請多多指教


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM