基于 AFNetworking 的网络库,具有委托处理网络响应,集成更多业务并优化网络性能,中文使用说明,设计文档
功能
- 使用您的客户密钥签名 http 参数
- 为 GET 和 POST 提供Http缓存
- 将域名替换为 IP 地址以改进性能并更改客户 http 头字段
- 拦截请求和响应
- 支持上传文件
- 模拟请求
要求
- iOS 8.0 或更高版本
- Xcode 7.3 或更高版本
安装
Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
pod 'JJNetwork'
end
运行以下命令:
$ pod install
使用 Carthage 安装
要将 JJNetwork 集成到您的 Xcode 项目中,请使用 Carthage,在您的 Cartfile
中指定它。
github "jezzmemo/JJNetwork"
运行 Carthage 以构建框架,并将构建的 AFNetworking.framework
和 JJNetwork.framework
拖入您的 Xcode 项目中。
使用方法
JJAPIRequest
每个网络请求都扩展自 JJAPIRequest
,然后实现 JJRequestInput
协议,重写一些方法。
例如:JJNetwork http://api.imemo8.com/diary.php
发送 GET 请求,参数:mod=getHotDiary
#import "JJNetwork.h"
@interface DemoRequest : JJAPIRequest
@end
#import "DemoRequest.h"
@implementation DemoRequest
- (NSString*)requestURL{
return @"http://api.imemo8.com/diary.php";
}
- (HTTPMethod)requestMethod{
return JJRequestGET;
}
@end
- 请求URL
填写完整请求URL,此方法必须,其他为可选
- 请求方法
返回枚举,POST,GET,PUT,DELETE,默认为 GET,如果未实现
参数和启动请求
#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:(JJAPIResponse *)response responseData:(id)data{
NSLog(@"responseSuccess");
}
- (void)responseFail:(JJAPIResponse *)response errorMessage:(NSError *)error{
NSLog(@"responseFail");
}
@end
- 调用
startRequest
将处理网络请求 - 实现
requestParameters
请求参数 responseSuccess
和responseFail
,网络响应
由客户密钥签名参数
- (NSString*)signParameterKey{
return @"key";
}
如果实现 signParameterKey
,则请求将添加两个参数,sign
和 timestamp
,sign = md5(parameters + timestamp + key)
为 GET 和 POST 选择缓存策略
- (HTTPCachePolicy)requestCachePolicy{
return JJReloadFromCacheTimeLimit;
}
//UNIT Second
- (NSUInteger)cacheLimitTime{
return 120;
}
- JJReloadFromNone: 默认模式,从网络请求
- JJReloadFromLocalCache: 如果有缓存,将返回缓存,如果原始来源更新,将替换新数据到旧缓存
- JJReloadFromCacheTimeLimit: 第一次加载请求原始来源,保存缓存,在限制时间内有效,如果过期,将返回 nil,如果原始来源更新,将替换新数据到旧缓存
如果选择 JJReloadFromCacheTimeLimit 策略,您必须实现 cacheLimitTime
最后,从 JJAPIRequest
继承任何类,调用 cacheFromCurrentRequest
方法,例如
id cacheData = [self.demoRequest cacheFromCurrentRequest];
NSLog(@"Local cache:%@",cacheData);
//show cache data
[self.demoRequest startRequest];
//request network and refresh UI
将域名替换为IP地址,提高性能并更改客户HTTP头部字段
JJAPIDominIPModule
@interface DomainModule : NSObject<JJAPIDominIPModule>
@end
@implementation DomainModule
- (NSDictionary*)domainIPData{
return @{@"api.imemo8.com":@"218.244.140.1"};
}
@end
JJAPIHttpHeadModule
@interface HttpHeadModule : NSObject<JJAPIHttpHeadModule>
@end
@implementation HttpHeadModule
- (NSDictionary*)customerHttpHead{
return @{@"user-token":@"xxxxx",@"device-id":@"xxxxx"};
}
@end
将模块注册到 JJAPIService+Extension
[JJAPIService registerDomainIP:[[DomainModule alloc] init]];
[JJAPIService registerHttpHeadField:[[HttpHeadModule alloc] init]];
Interseptor
- 从
JJAPIServiceInterseptor
实现到JJAPIService
对象的实例
- (DemoAPIService*)apiService{
if (_apiService != nil) {
return _apiService;
}
_apiService = [[DemoAPIService alloc] init];
_apiService.serviceProtocol = self;
_apiService.serviceInterseptor = self;
return _apiService;
}
- JJAPIService (Extension)
+ (void)addServiceInterseptor:(id<JJAPIServiceInterseptor>)interseptor forServiceClass:(Class)className;
+ (void)removeServiceInterseptor:(id<JJAPIServiceInterseptor>)interseptor forServiceClass:(Class)className;
例如
[JJAPIService addServiceInterseptor:self forServiceClass:[DemoAPIService class]];
- (void)beforeRequest:(JJAPIRequest*)request{
NSLog(@"beforeRequest");
}
- (void)afterRequest:(JJAPIRequest*)request{
NSLog(@"afterRequest");
}
- (void)response:(JJAPIResponse*)response beforeResponseData:(id)data{
NSLog(@"beforeResponse");
}
- (void)response:(JJAPIResponse*)response afterResponseData:(id)data{
NSLog(@"afterResponse");
}
- 控制加载显示/隐藏
- AOP 请求
上传文件
支持上传一个或多个文件,UploadFileDemoRequest的demo
#import <JJNetwork/JJNetwork.h>
@interface UploadFileDemoRequest : JJAPIRequest
@end
@implementation UploadFileDemoRequest
- (NSString*)requestURL{
return @"http://api.imemo8.com/xxxx.php";
}
- (HTTPMethod)requestMethod{
return JJRequestPOST;
}
- (JJUploadFileBlock)requestFileBody{
return ^(id<JJUploadFileBody> fileBody){
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
[fileBody addFileURL:[NSURL fileURLWithPath:filePath] name:@"file" fileName:@"backup" mimeType:@"json"];
};
}
@end
ViewController的Demo
- (void)viewDidLoad {
[super viewDidLoad];
[self.demoRequest startRequest];
}
#pragma mark - Upload file
- (NSDictionary*)requestParameters:(JJAPIRequest *)request{
return @{@"mod":@"upload"};
}
#pragma mark - Get property
- (UploadFileDemoRequest*)demoRequest{
if (_demoRequest != nil) {
return _demoRequest;
}
_demoRequest = [UploadFileDemoRequest new];
_demoRequest.delegate = self;
return _demoRequest;
}
实现requestFileBody
方法,添加文件信息,这是通过HTTP上传文件,建议上传较小的文件
Mock请求
设置Mock请求并添加Mock请求
-(instancetype)init{
self = [super init];
if (self) {
[self setupMockConfing];
[self setupMockRequest];
}
return self;
}
- (void)setupMockConfing{
//Global settings
JJAPIMock.mockSwitch = NO;
}
- (void)setupMockRequest{
//Add mock request
[JJAPIMock testRequest:[DemoRequest class] responseString:@"<HTML></HTML>" isOn:YES];
}
License
JJNetwork遵照MIT许可证发布。查看LICENSE获取详细信息。