Swift 网络请求库Moya的使用
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的使用相关推荐
- Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求
Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求 转自 http://www.cocoachina.com/ios/20141202/10390.html 本 ...
- swift中网络请求库的封装(Alamofire+HandyJSON)
swift中网络请求库的封装(Alamofire+HandyJSON) 我们用swift语言来写iOS的程序,会用Alamofire+HandyJSON来取代AFNetworking+MJExtens ...
- 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合
自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...
- android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库
XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装.还不赶紧点击使用说明文档,体验一下吧! 项目地址 关于我 https://github ...
- 兼容微信小程序的流式网络请求库
本项目从属于笔者的Web开发入门与最佳实践之前端开源项目系列.如果对于HTTP协议与规范尚不掌握的建议阅读HTTP 基础与变迁一文.如果对于REST尚不掌握的推荐阅读来自微软的接口设计指南以及来自于P ...
- Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 接着上篇说,如果你真以为Requests网络请求库只有Get请求和Post请求 ...
- 「Python 编程」编码实现网络请求库中的 URL 解析器
相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库.这里回顾一下它们的基本用法,例如使用 Requests 库向目标网站发出 GET 请求: impo ...
- Python网络请求库Requests,妈妈再也不会担心我的网络请求了(一)
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 网络请求可能是每门语言比较重要的一部分了,在Python语言中,虽然有urll ...
- python的网络请求库urllib、urllib2、urllib3、request的联系
文章目录 1. 简介 2. urllib 3. urllib2 4. urllib3 5. requests 6. 相关文章 1. 简介 urllib.urllib2.urllib3.request均 ...
最新文章
- GDB多进程调试(转)
- 计网 - IPv4 协议:路由和寻址的区别是什么?
- blob转成json js_javascript – 文件API – Blob到JSON
- 和某ZYC巨佬和XXY巨佬的随机挑战2总结
- 基于leveldb,levigo做二次开发
- 求助了,园子里的高手们,软件运行报401错误
- 实用、酷炫的可视化,你用10小时,同事用10分钟,差距在哪?
- 电脑音箱有电流声_音箱造成电流声的原因
- 2018ACM上海大都会赛: A. Fruit Ninja(这绝对是道原题+随机)
- 如何快速制作漫画App?
- 砂.随笔.十七.谋定而后动
- CDGA|数据虚拟化助力数据治理成效显著
- 把你的手机、平板变成电脑第二屏:Windows 屏幕扩展工具横评
- 【华为机试真题 JAVA】勾股数元组-100
- Win10 企业版 2016 长期服务版激活
- matlab怎样灰度变换,matlab灰度变换函数
- The projects in the reactor contain a cyclic reference
- PHP验证码类庫,php验证码类
- stm32-beep蜂鸣器-手把手教学(如何使用原理图)
- ZJNU 2448 Spiderman
热门文章
- C语言学习笔记11-结构体(struct、结构作为函数参数、结构数组)、联合体/共用体typedef; union(大、小端序)
- VNC CentOS Linux下VNC Server远程桌面配置详解
- python模拟行星运动_Java课程设计——模拟行星运动
- 基于Java EE新闻管理系统的设计与实现
- 计算机系学生笔记本,985 高校计算机系学生都在用的笔记本,我被深深地种草了!...
- 贷后催收评分模型中的数据清洗与数据治理细节介绍
- JAVA实训-连连看(二)
- STM32F103芯片FSMC使用外扩SRAM芯片
- 老子《道德经》第六十二章
- EasyAR-Web手把手基于官方demo的实现