基于AFNetworking封装的网络库,主要是为了满足一些复杂App的网络请求,开题报告,并在层次划分上比较清新,所有的网络请求是数据提供者,还归纳了一些常见的功能封装在里面(缓存,签名...),设计文档
特色功能[x] 自定义Key签名参数
[x] 缓存不止支持GET,还支持POST,根据自己的场景,自己选择策略
[x] 支持用IP替换域名,达到提高网络性能,支持HTTP HEAD设置
[x] 拦截网络请求,方便拦截任意请求,复用请求,加入Loading
安装环境iOS 8.0以上
Xcode 7.3以上
如何安装Podfilesource 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' target 'TargetName' do pod 'JJNetwork' end执行命令:
$ pod install使用Carthage集成在你的Cartfile文件里,加入以下内容:
github 'jezzmemo/JJNetwork'将 AFNetworking.framework,JJNetwork.framework 两个framework加入到自己的项目
如何使用JJAPIRequest每个网络请求都是继承JJAPIRequest,并按照JJRequestInput协议的方法,按照自己的需求,重写(overwrite)指定的方法,来满足自己的需求.
下面我用JJNetwork来向发送一个GET请求,参数是mod=getHotDiary:
#import 'JJNetwork.h' @interface DemoRequest : JJAPIRequest @end #import 'DemoRequest.h' @implementation DemoRequest - (NSString*)requestURL{ return @''; } - (HTTPMethod)requestMethod{ return JJRequestGET; } @endrequestURL
填写一个完整的URL,继承JJAPIRequest的时候,必须需要实现这个方法,其余方法都是可选的,
requestMethod
返回一个枚举类型,POST,GET,PUT,DELETE,如果不实现,默认是GET
关于在哪初始化Request,这个根据自己的情况自己选择,你可以在ViewController里调用,也可以再自己的中间层调用,这里给的例子是在ViewController里的例子:
#import 'PresentViewController.h' #import 'DemoRequest.h' @interface PresentViewController ()<JJRequestDelegate> @property(nonatomic,readwrite,strong)DemoRequest* demoRequest; @end @implementation PresentViewController - (void)viewDidLoad { [super viewDidLoad]; [self.demoRequest startRequest]; } #pragma mark - Get property - (DemoRequest*)demoRequest{ if (_demoRequest != nil) { return _demoRequest; } _demoRequest = [DemoRequest new]; _demoRequest.delegate = self; return _demoRequest; } #pragma mark - Request parameter - (NSDictionary*)requestParameters:(JJAPIRequest *)request{ return @{@'mod':@'getHotDiary'}; } #pragma mark - Network response - (void)responseSuccess:(JJAPIRequest *)request responseData:(id)data{ NSLog(@'responseSuccess'); } - (void)responseFail:(JJAPIRequest *)request errorMessage:(NSError *)error{ NSLog(@'responseFail'); } @end调用startRequest方法执行网络请求
实现requestParameters来提供请求的参数,网络情况的输入
responseSuccess和responseFail,网络请求的输出
至于为什么选择Delegate这种交互方式,传送门
使用自定义Key签名参数,示例如下:- (NSString*)signParameterKey{ return @'key'; }如果使用了signParameterKey方法,就会产生两个参数sign和timestamp,并且实现的方式是:md5(parameters + timestamp + key)
GET和POST都支持缓存,示例如下:- (HTTPCachePolicy)requestCachePolicy{ return ReloadFromCacheTimeLimit; } - (NSUInteger)cacheLimitTime{ return 120; }如果选择了ReloadFromCacheTimeLimit缓存策略,就必须实现cacheLimitTime方法,作用是你的缓存持续的时间,过期后将从网络上重新请求,选择其他两种则不需要实现cacheLimitTime
ReloadFromNetwork: 只从网络获取
ReloadFromCacheElseLoadNetwork: 有缓存就从缓存获取,没有就从网路获取
ReloadFromCacheTimeLimit: 缓存限定的时间范围内
支持用IP替换域名(服务器要支持IP访问),达到提高网络性能,支持HTTP HEAD设置JJAPIDominIPModule
@interface DomainModule : NSObject<JJAPIDominIPModule> @end @implementation DomainModule - (NSDictionary*)domainIPData{ return @{@'api.imemo8.com':@'218.244.140.1'}; } @endJJAPIHttpHeadModule
@interface HttpHeadModule : NSObject<JJAPIHttpHeadModule> @end @implementation HttpHeadModule - (NSDictionary*)customerHttpHead{ return @{@'user-token':@'xxxxx',@'device-id':@'xxxxx'}; } @end并注册到JJAPIRequest+Extension
[JJAPIRequest registerDomainIP:[[DomainModule alloc] init]]; [JJAPIRequest registerHttpHeadField:[[HttpHeadModule alloc] init]];这是两个设置的接口,DomainModule是将域名替换成IP,减少了DNS的时间,开题报告,从而提高访问速度.
HttpHeadModule是设置全局的Head Field,根据自己的项目需要来决定是否需要设置.
拦截器的使用#p#分页标题#e#
从JJAPIRequest实例化对象的requestInterseptor的属性,并实现JJRequestInterseptor协议:
- (DemoRequest*)demoRequest{ if (_demoRequest != nil) { return _demoRequest; } _demoRequest = [DemoRequest new]; _demoRequest.delegate = self; _demoRequest.requestInterseptor = self; return _demoRequest; }JJAPIService 的扩展实现以下方法,可以监听任意JJAPIService子类:
+ (void)addRequestInterseptor:(id<JJRequestInterseptor>)interseptor forRequestClass:(Class)className; + (void)removeRequestInterseptor:(id<JJRequestInterseptor>)interseptor forRequestClass:(Class)className;使用示例:
[JJAPIService addServiceInterseptor:self forServiceClass:[DemoAPIService class]]; - (void)beforeRequest:(JJAPIRequest*)request{ NSLog(@'网络发送Request执行前'); } - (void)afterRequest:(JJAPIRequest*)request{ NSLog(@'网络发送Request执行后'); } - (void)request:(JJAPIRequest*)request beforeResponse:(id)data{ NSLog(@'返回结果前'); } - (void)request:(JJAPIRequest*)request afterResponse:(id)data{ NSLog(@'返回结果后'); }主要应用的两个场景就是Loading的显示和关闭,还有就是如果我需要用某个网络请求的数据,不需要改动原来的业务逻辑,只需要添加一份拦截即可,对已有的代码不需要任何改动.
https://github.com/jezzmemo/JJNetwork