自定义 Alamofire 的 response serializer
Alamofire 的 DataRequest 类针对二进制数据、字符串、json、属性列表提供了一系列方便解析的方法(内部实际上使用的是 Response Serializer),现在我们要针对服务端返回的数据格式定义我们自己的 Response Serializer。
假设服务器返回的数据格式是这样的:
{
"code": 0,
"datas": {
"name": "Jack",
"age": 13
},
"message": ""
}
其中 datas、message 对应的数据可能为空,我们来针对这个格式定义 Response Serializer。
从二进制数据到数据模型,直接使用 Swift 4 内置的 JSONDecoder 进行解析,所以,定义的模型需要遵从 Decodable 协议(下面的代码,我为了偷懒直接写了 Codable)。
struct Response<T: Codable>: Codable {
let code: Int
let datas: T?
let message: String?
}
struct Person: Codable {
let name: String
let age: Int
}
extension DataRequest {
static func customResponseSerializer<T: Codable>(type: T.Type) -> DataResponseSerializer<T> {
return DataResponseSerializer(serializeResponse: { (request, response, data, error) -> Result<T> in
guard error == nil else {
return .failure(error!)
}
let result = Request.serializeResponseData(response: response, data: data, error: nil)
switch result {
case .success(let validData):
do {
let entity = try JSONDecoder().decode(T.self, from: validData)
return .success(entity)
} catch {
return .failure(error)
}
case .failure(let error):
return .failure(error)
}
})
}
@discardableResult
func responseCustomObject<T: Codable>(queue: DispatchQueue? = nil,
type: T.Type,
completion: @escaping (DataResponse<T>) -> Void) -> Self {
return response(queue: queue, responseSerializer: Alamofire.DataRequest.customResponseSerializer(type: type), completionHandler: completion)
}
}
使用的时候,这样就好了:
Alamofire.request("http://mall.cnrmall.com/api/app/version_check").responseCustomObject(type: Response<VersionInfo>.self) { (response) in
switch response.result {
case .success(let value):
print(value)
case .failure(let error):
print("error: \(error.localizedDescription)")
}
}
自定义 Alamofire 的 response serializer的更多相关文章
- .net中自定义过滤器对Response内容进行处理
原文:http://www.cnblogs.com/zgqys1980/archive/2008/09/02/1281895.html 代码DEMO:http://files.cnblogs.com/ ...
- django (装饰器,母版继承,自定义,request对象,response对象)
1. 装饰器 1. def wrapper(fn): def inner(*args,**kwargs): 执行被装饰函数之前的操作 ret = fn(*args,** ...
- ios 设置head请求头,自定义head, read response header
AFHTTPSessionManager *manger = [AFHTTPSessionManager manager]; manger.securityPolicy = [AFSecurityPo ...
- Alamofire源码解读系列(九)之响应封装(Response)
本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...
- drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族
目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...
- Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/html"
2015-11-16 10:39:17.235 PullDemo[338:60b] Application windows are expected to have a root view contr ...
- Alamofire 的使用
最近,AFNetworking 的作者Mattt Thompson提交了一个新的类似于 AFNetworking 的网络 基础库,并且是专门使用最新的 Swift 语言来编写的,名为:Alamofir ...
- Alamofire网络库基础教程
原文 Beginning Alamofire Tutorial 原文作者 Essan Parto译者 星夜暮晨(QQ:412027805) http://www.jianshu.com/p/f1208 ...
- Alamofire网络库进阶教程
本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Intermediate Alamofire Tutorial,敬请勘误. 欢迎回到我们的 Alamofire ...
随机推荐
- Day 07--最终修改(三)
2.明天着重学一下逻辑层的语法,以及界面层的数据绑定,与队友交流进度 3.今天修改也终于完成,除了搞c++以外的全部身心都放在这个东西身上也觉得它有点难搞,说明计算机不是吃素的.甚至在使用xml语法的 ...
- 使用Makefile构建Docker
使用Makefile构建Docker 刚开始学习docker命令的时候,很喜欢一个字一个字敲,因为这样会记住命令.后来熟悉了之后,每次想要做一些操作的时候就不得不 重复的输入以前的命令.当切换一个项目 ...
- c++中strcmp,strcopy函数的使用
1.strcmp(str1,str2) C/C++函数,比较两个字符串, 设这两个字符串为str1,str2,若str1==str2,则返回零:若str1<str2,则返回负数:若str1> ...
- egret之红包满屏随意飘动
在做这个需求之前,我们假设屏幕上同时飘动的红包数最大为10 ) { let redBag = GameUtil.createBitmapByName("Red_bag_png"); ...
- Unity官方案例精讲_2015_优化
1.将公共变量从Inspector视图中隐藏: [HideInInspector] [HideInInspector] public GameObject player; 2.限定Inspect ...
- Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)
Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles) 深度优先搜索的解题详细介绍,点击 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递 ...
- urllib爬虫模块
网络爬虫也称为网络蜘蛛.网络机器人,抓取网络的数据.其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好.一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务 ...
- Linux下手动安装JDK
一.删除自带的JDK 查询系统自带JDK rpm -qa | grep java rpm -qa | grep jdk 删除查询出来的文件名 rpm -e --nodeps 文件名 命令执行成功后重新 ...
- yield 实现range()函数
def range(*args,step= 1): args = list(args) if len(args) == 2: yield args[0] while args[0]<args[1 ...
- PHP 实现字符串表达式计算
什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执 ...