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)

        }

 
 

第一次写博客  写的不好请多多指教

posted @ 2018-03-05 13:23  早起鸟儿有虫吃  阅读(4347)  评论(11编辑  收藏  举报