Moya是Swift中的网络库Alamofire的二次封装,Alamofire本身使用起来是很简单方便的,例子如下:

func loadData(){var param = [String:String]()param["pageNo"] = "1"param["Type"] = "8"param["pageSize"] = "10"Alamofire.request("https://www.baidu.com",parameters:param).responseJSON { (responseJson) inswitch responseJson.result {case .success(let data):print(data)//Alamofire默认返回的是一个解析过的数据结构,这里代表一个字典if data is Dictionary<String, Any>{let data2 = data as! Dictionary<String, Any>print(data2["Msg"]!)}case .failure(let error):print(error)}}}

Moya的优缺点:

(1)在我们项目的 Service、View、或者 Model 文件中可能都会出现请求网络数据的情况,如果直接使用 Alamofire,不仅很繁琐,而且还会使代码变得很混乱。
(2)过去我们通常的做法是在项目中添加一个网络请求层(比如叫做 APIManager、或者 NetworkModel),用来管理网络请求。但这样做可能会遇到一些问题:
难以开发一个新的 App(不知从哪里下手)
难以维护现有的 App(这一层比较混乱,混合了各种请求不好管理。)
难以做做单元测试。
(3)而 Moya 作为一个基于 Alamofire 的更高层网络请求封装抽象层,拥有更好更清晰的网络管理。不仅可以轻松实现简单的事情,对于复杂的情况也轻松应对。它有如下优点:
定义了一个清晰的网络结构(通过枚举值定义不同的请求)
可以简单地进行网络单元测试

Moya的使用方法

1、首先创建一个swift文件,创建一个枚举,定义三个请求,如下:

/*封装的moya请求管理类*/
enum HttpRequest {case shujuList(channnel:String , pn:Int , ps:Int) //列表数据请求,带有相关值的枚举,case othetRequest(str:String) //带一个参数的请求case otherRequest2 //不带参数的请求
}

枚举中包含三个请求,分别是请求列表数据(附带三个参数)和一个其他的附带一个参数的请求和一个不带参数的请求。

2、创建扩展,遵循协议实现协议的方法,如下:

/*遵循mayo协议,实现方法*/
extension HttpRequest : TargetType{//服务器地址var baseURL: URL {return URL(string:"www.baidu.com")!}//各个请求的具体路径var path: String {switch self {case .shujuList:return "ArticleList"case .othetRequest:return "someOtherPath"default:return ""}}//请求方式var method: Moya.Method {return .get}//请求任务事件(这里附带上参数)var task: Task {var param:[String:Any] = [:]switch self {case let .shujuList(channel , pn , ps):param["Type"] = channelparam["pageNo"] = pnparam["pageSize"] = pscase let .othetRequest(str):param["str"] = strdefault://不需要传参数的走这里return .requestPlain}return .requestParameters(parameters: param, encoding: URLEncoding.default)}//是否执行Alamofire验证public var validate: Bool {return false}//这个就是做单元测试模拟的数据,只会在单元测试文件中有作用public var sampleData: Data {return "{}".data(using: String.Encoding.utf8)!}//设置请求头public var headers: [String: String]? {return nil}
}

这里通过TargetType协议的方法,设置了baseURL,请求方式和和参数,以及请求头等各个请求的参数。

3、发起网络请求

在需要的地方,调用网络管理类发起三个请求中的一个,这里以第一个为例,代码如下:

func loadDataWithMoya(pn:Int , ps:Int) -> () {let provide = MoyaProvider<HttpRequest>()provide.request(.shujuList(channnel: "8", pn: pn, ps: ps)) { Result inswitch Result {case let .success(response)://数据解析let json = JSON(response.data)print(json)case let .failure(error):print(error)}}
}

需要注意的是,Moya默认回传的是二进制的裸数据,需要自己进行解析,我使用了SwiftyJSON进行了解析。如果要进行模型转换的话推荐系统自带的Codable。

Moya参考博客
SwiftyJSON参考博客

Swift 网络请求库Moya的使用相关推荐

  1. Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求

    Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求 转自 http://www.cocoachina.com/ios/20141202/10390.html 本 ...

  2. swift中网络请求库的封装(Alamofire+HandyJSON)

    swift中网络请求库的封装(Alamofire+HandyJSON) 我们用swift语言来写iOS的程序,会用Alamofire+HandyJSON来取代AFNetworking+MJExtens ...

  3. 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合

    自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...

  4. android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库

    XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装.还不赶紧点击使用说明文档,体验一下吧! 项目地址 关于我 https://github ...

  5. 兼容微信小程序的流式网络请求库

    本项目从属于笔者的Web开发入门与最佳实践之前端开源项目系列.如果对于HTTP协议与规范尚不掌握的建议阅读HTTP 基础与变迁一文.如果对于REST尚不掌握的推荐阅读来自微软的接口设计指南以及来自于P ...

  6. Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 接着上篇说,如果你真以为Requests网络请求库只有Get请求和Post请求 ...

  7. 「Python 编程」编码实现网络请求库中的 URL 解析器

    相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库.这里回顾一下它们的基本用法,例如使用 Requests 库向目标网站发出 GET 请求: impo ...

  8. Python网络请求库Requests,妈妈再也不会担心我的网络请求了(一)

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 网络请求可能是每门语言比较重要的一部分了,在Python语言中,虽然有urll ...

  9. python的网络请求库urllib、urllib2、urllib3、request的联系

    文章目录 1. 简介 2. urllib 3. urllib2 4. urllib3 5. requests 6. 相关文章 1. 简介 urllib.urllib2.urllib3.request均 ...

最新文章

  1. GDB多进程调试(转)
  2. 计网 - IPv4 协议:路由和寻址的区别是什么?
  3. blob转成json js_javascript – 文件API – Blob到JSON
  4. 和某ZYC巨佬和XXY巨佬的随机挑战2总结
  5. 基于leveldb,levigo做二次开发
  6. 求助了,园子里的高手们,软件运行报401错误
  7. 实用、酷炫的可视化,你用10小时,同事用10分钟,差距在哪?
  8. 电脑音箱有电流声_音箱造成电流声的原因
  9. 2018ACM上海大都会赛: A. Fruit Ninja(这绝对是道原题+随机)
  10. 如何快速制作漫画App?
  11. 砂.随笔.十七.谋定而后动
  12. CDGA|数据虚拟化助力数据治理成效显著
  13. 把你的手机、平板变成电脑第二屏:Windows 屏幕扩展工具横评
  14. 【华为机试真题 JAVA】勾股数元组-100
  15. Win10 企业版 2016 长期服务版激活
  16. matlab怎样灰度变换,matlab灰度变换函数
  17. The projects in the reactor contain a cyclic reference
  18. PHP验证码类庫,php验证码类
  19. stm32-beep蜂鸣器-手把手教学(如何使用原理图)
  20. ZJNU 2448 Spiderman

热门文章

  1. C语言学习笔记11-结构体(struct、结构作为函数参数、结构数组)、联合体/共用体typedef; union(大、小端序)
  2. VNC CentOS Linux下VNC Server远程桌面配置详解
  3. python模拟行星运动_Java课程设计——模拟行星运动
  4. 基于Java EE新闻管理系统的设计与实现
  5. 计算机系学生笔记本,985 高校计算机系学生都在用的笔记本,我被深深地种草了!...
  6. 贷后催收评分模型中的数据清洗与数据治理细节介绍
  7. JAVA实训-连连看(二)
  8. STM32F103芯片FSMC使用外扩SRAM芯片
  9. 老子《道德经》第六十二章
  10. EasyAR-Web手把手基于官方demo的实现