基于AFNetworking3.0网络封装 概述 Version 3.2.1 Version 3.2.0 升级为3.0版本 常用接口类型 取消请求 缓存 BaseURL 添加公共请求头参数 请求、响应类型 URL编码问题 格式化接口数据打印日志 安装使用 源代码 温馨提示

基于AFNetworking3.0网络封装
概述
Version 3.2.1
Version 3.2.0
升级为3.0版本
常用接口类型
取消请求
缓存
BaseURL
添加公共请求头参数
请求、响应类型
URL编码问题
格式化接口数据打印日志
安装使用
源代码
温馨提示

对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口。很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了。

对于使用AFNetworking的朋友来说,很多朋友都是直接调用AFNetworkingAPI,这样不太好,无法做到全工程统一配置。

最好的方式就是对网络层再封装一层,全工程不允许直接使用AFNetworkingAPI,必须调用我们自己封装的一层,如此一来,任何网络配置都可以在这一层里配置好,使用的人无须知道里面在干嘛,只管调用就可以了。

本篇为基于AFNetworking3.0以上的版本,支持iOS7及其以上版本。若要支持iOS6,请阅读旧版本:基于AFNetworking2.5封装

Version 3.2.1

  • 完善缓存机制及无网或者网络异常状态下取缓存数据

Version 3.2.0

  • 增加超时设置
  • 增加网络异常时是否读取本地缓存的策略

升级为3.0版本

  • 简化API,以降低使用的要求
  • 增加GET/POST数据缓存、获取缓存大小、清空缓存功能
  • 接口增加刷新缓存功能
  • 增加取消所有请求、取消单个请求功能
  • 格式化打印日志
  • 增加对手动取消请求接口是否在失败时还回调的控制

常用接口类型

应用开发过程中,所使用类型通常是GETPOST及上传图片。因此,这里只是对这几种类型提供API

GET接口

这里提供了两个GET请求的API,需要一般情况下GET请求都是直接写一个完整的URL,但是有时候为了参数可读性更强,改成传一个字典过来更容易阅读。

HYBResponseSuccess是响应成功的回调,返回的是字典,外部再转换成模型就可以了。
HYBResponseFail是响应失败的回调,只有一个NSError对象,外部可接收处理。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
/*!
*  @author 黄仪标, 15-11-15 13:11:50
*
*  GET请求接口,若不指定baseurl,可传完整的url
*
*  @param url     接口路径,如/path/getArticleList
*  @param refreshCache 是否刷新缓存。由于请求成功也可能没有数据,对于业务失败,只能通过人为手动判断
*  @param success 接口成功请求到数据的回调
*  @param fail    接口请求数据失败的回调
*
*  @return 返回的对象中有可取消请求的API
*/
url
refreshCache
success
;
// 多一个params参数
url
refreshCache
params
success
;
// 多一个带进度回调
url
refreshCache
params
progress
success
;
 

POST接口

对于POST请求类型的接口,只有一个,看注释就可以明白如何使用了。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
/*!
*  @author 黄仪标, 15-11-15 13:11:50
*
*  POST请求接口,若不指定baseurl,可传完整的url
*
*  @param url     接口路径,如/path/getArticleList
*  @param success 接口成功请求到数据的回调
*  @param fail    接口请求数据失败的回调
*
*  @return 返回的对象中有可取消请求的API
*/
url
refreshCache
params
success
;
url
refreshCache
params
progress
success
;
 

图片上传接口

接口一次只能上传一张图片,通常也是这么处理的。这里是以文件流的形式来上传的哦。其中,mineTypeimage/jpeg

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
/**
*  @author 黄仪标, 16-01-31 00:01:40
*
*  图片上传接口,若不指定baseurl,可传完整的url
*
*  @param image            图片对象
*  @param url              上传图片的接口路径,如/path/images/
*  @param name             与指定的图片相关联的名称,这是由后端写接口的人指定的,如imagefiles
*  @param mimeType     默认为image/jpeg
*  @param parameters   参数
*  @param progress     上传进度
*  @param success      上传成功回调
*  @param fail             上传失败回调
*
*  @return
*/
image
url
filename
name
mimeType
parameters
progress
success
;
 

上传文件接口

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
/**
*  @author 黄仪标, 16-01-31 00:01:59
*
*  上传文件操作
*
*  @param url                      上传路径
*  @param uploadingFile    待上传文件的路径
*  @param progress         上传进度
*  @param success              上传成功回调
*  @param fail                 上传失败回调
*
*  @return
*/
url
uploadingFile
progress
success
;
 

文件下载接口

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
/*!
*  @author 黄仪标, 16-01-08 15:01:11
*
*  下载文件
*
*  @param url           下载URL
*  @param saveToPath    下载到哪个路径下
*  @param progressBlock 下载进度
*  @param success       下载成功后的回调
*  @param failure       下载失败后的回调
*/
url
saveToPath
progressBlock
success
;
 

取消请求

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
/**
*  @author 黄仪标
*
*  取消所有请求
*/
;
/**
*  @author 黄仪标
*
*  取消某个请求。如果是要取消某个请求,最好是引用接口所返回来的HYBURLSessionTask对象,
*  然后调用对象的cancel方法。如果不想引用对象,这里额外提供了一种方法来实现取消某个请求
*
*  @param url              URL,可以是绝对URL,也可以是path(也就是不包括baseurl)
*/
;
 

在使用中,可以通过这样来调用:

 
1
2
3
4
5
6
7
8
9
10
 
// 取消全部请求
//  [HYBNetworking cancelAllRequest];
  
// 取消单个请求方法一
//  [HYBNetworking cancelRequestWithURL:path];
  
// 取消单个请求方法二
//  [task cancel];
 

缓存

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
/**
*  @author 黄仪标
*
*  默认只缓存GET请求的数据,对于POST请求是不缓存的。如果要缓存POST获取的数据,需要手动调用设置
*  对JSON类型数据有效,对于PLIST、XML不确定!
*
*  @param isCacheGet           默认为YES
*  @param shouldCachePost  默认为NO
*/
;
 
/**
*  @author 黄仪标
*
*  获取缓存总大小/bytes
*
*  @return 缓存大小
*/
;
 
/**
*  @author 黄仪标
*
*  清除缓存
*/
;
 

BaseURL

这里还提供了两个公共接口,一个是用于设置或者更新网络接口的基础URL,一个是获取当前设置使用的网络接口基础URL。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
/*!
*  @author 黄仪标, 15-11-15 13:11:45
*
*  用于指定网络请求接口的基础url,如:
*  http://henishuo.com或者http://101.200.209.244
*  通常在AppDelegate中启动时就设置一次就可以了。如果接口有来源
*  于多个服务器,可以调用更新
*
*  @param baseUrl 网络接口的基础url
*/
;
;
 

添加公共请求头参数

通常每家公司的接口都会设置公共的请求头参数,以代表是公司的接口。默认已经配置了可接收的类型,但是如果需要额外配置,可通过调用此api来添加:

 
1
2
3
4
5
6
7
8
9
10
 
/*!
*  @author 黄仪标, 15-11-16 13:11:41
*
*  配置公共的请求头,只调用一次即可,通常放在应用启动的时候配置就可以了
*
*  @param httpHeaders 只需要将与服务器商定的固定参数设置即可
*/
;
 

请求、响应类型

默认responseType和requestType都是JSON格式。如果不使用JSON,可以全局配置成自己希望的格式即可。若不配置,默认就是JSON。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
/*!
*  @author 黄仪标, 15-12-25 15:12:45
*
*  配置请求格式,默认为JSON。如果要求传XML或者PLIST,请在全局配置一下
*
*  @param requestType 请求格式,默认为JSON
*  @param responseType 响应格式,默认为JSO,
*  @param shouldAutoEncode YES or NO,默认为NO,是否自动encode url
*  @param shouldCallbackOnCancelRequest 当取消请求时,是否要回调,默认为YES
*/
requestType
responseType
shouldAutoEncode
;
 

URL编码问题

考虑到网络请求接口中,有时候会有中文参数,这时候就会请求失败,因此我们要对这种类型的URL进行编码,否则请求会失败。这里是开启或者关闭自动将URL编码的接口,默认为NO,表示不开启。

 
1
2
3
4
5
6
7
8
9
10
 
/*!
*  @author 黄仪标, 15-11-15 15:11:16
*
*  开启或关闭是否自动将URL使用UTF8编码,用于处理链接中有中文时无法请求的问题
*
*  @param shouldAutoEncode YES or NO,默认为NO
*/
;
 

格式化接口数据打印日志

 
1
2
3
4
5
6
7
8
9
10
 
/*!
*  @author 黄仪标, 15-11-15 14:11:40
*
*  开启或关闭接口打印信息
*
*  @param isDebug 开发期,最好打开,默认是NO
*/
;
 

开启后会有非常好的打印效果,效果如下:

基于AFNetworking3.0网络封装
概述
Version 3.2.1
Version 3.2.0
升级为3.0版本
常用接口类型
取消请求
缓存
BaseURL
添加公共请求头参数
请求、响应类型
URL编码问题
格式化接口数据打印日志
安装使用
源代码
温馨提示

通常在AppDelegate中应用启动的代理方法中调用设置为开启就可以了。不过是否设置为开启,当应用以发布证书打包时,都不会打印日志,因为这里做了处理,可放心使用。现在已经公开在外部,项目中都可以使用哦:

 
1
2
3
4
5
6
7
8
 
// 项目打包上线都不会打印日志,因此可放心。
#ifdef DEBUG
#else
#define HYBAppLog(s, ... )
#endif
 

安装使用

现在已经支持cocoapods,引入以下命令即可:

 
1
2
3
 
'~> 3.0.0'
 

或者直接下载源代码,拖入工程使用!

源代码

请大家到我的github下载源代码:HYBNetworking

温馨提示

最近老有人问:编译一直报错library not found for -lAFNetworking什么问题?

注意:如果您是使用cocoapods来管理第三方库的,那么直接通过上面安装使用的方式来安装即可,然后pod update一下。如果您不是使用cocoapods来引入的,请手动将AFNetworking对应的版本添加到工程。