Moya简单使用方法

最开始自己也是使用Alamofire进行网络请求,后面听说有Moya这种请求方法。一下就喜欢上了。话不多说,下面直接上代码。

import Moya
import Result

enum API {
    case login(parameters:[String: Any])  // 登录
    case getAllProjUser // 获取用户参与的所有项目
}

然后实现TargetType这个协议。Xcode会提示需要添加的代码,点击提示自动补全代码。这里在method会报一个错误。需要改成Moya.Method就OK。

extension API:TargetType{
    
    var baseURL: URL {
        return URL(string: "https://www.baidu.com?search=")!
    }
    
    var path: String {
        switch self {
        case .login:
            return "Login"
        case .getAllProjUser:
            return "GetAllProj"
        }
    }
    
    var getPartmeters: [String: Any]{
        
        switch self {
        case let .login(dict):
            return dict
        case .getAllProjUser:
            return [:]
        }
    }
    
    var task: Task {
        return .requestParameters(parameters: getPartmeters, encoding: JSONEncoding.default)
    }
    
    var method: Moya.Method {
        return .post
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var headers: [String : String]? {
        return nil
    }
}

到此,API设计就完成了。下一步进行网络请求方法的代码。

在这里,我们设置了myEndpointClosure。主要是设置超时时间和解决URL带有?时,无法正确的链接地址的bug。在没知道这个之前,我还是通过修改源码来解决这个问题。

import Moya

/// 超时时长
private var requestTimeOut:Double = 30

///endpointClosure
private let myEndpointClosure = { (target: API) -> Endpoint in
    ///主要是为了解决URL带有?无法请求正确的链接地址的bug
    let url = target.baseURL.absoluteString + target.path
    var endpoint = Endpoint(
        url: url,
        sampleResponseClosure: { .networkResponse(200, target.sampleData) },
        method: target.method,
        task: target.task,
        httpHeaderFields: target.headers
    )
    switch target {
    case .login:
        requestTimeOut = 5//按照项目需求针对单个API设置不同的超时时长
        return endpoint
    default:
        requestTimeOut = 30//设置默认的超时时长
        return endpoint
    }
}


struct Network {
    static let provider = MoyaProvider<API>(endpointClosure: myEndpointClosure)
    
    static func request(_ target: API, successCallback: @escaping ([String:Any]) -> Void,
                        failure failureCallback: @escaping (String) -> Void){
        provider.request(target) { (result) in
            
            switch result{
            case let .success(response):
                if let json = try? response.mapJSON() as! [String:Any]{
                    successCallback(json)
                }
                else{
                    print("服务器连接成功,数据获取失败")
                }
            case let .failure(error):
                failureCallback(error.errorDescription!)
            }
        }
    }
    // MARK: - 取消所有网络请求
    static func cancelAllRequest(){
        provider.manager.session.getAllTasks { (tasks) in
            tasks.forEach{
                print("取消网络请求一次")
                $0.cancel()
            }
        }
    }
}

下一步是使用方法,上代码。

 let parameters = ["account":account,"password":password]
 Network.request(.login(parameters: parameters), successCallback: { (json) in
                print(json)
            }) { (msg) in
                print(msg)
            }
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345