JJNetwork 1.0.8

JJNetwork 1.0.8

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2018年7月

jezz 维护。



JJNetwork 1.0.8

  • 作者
  • Jezz

CocoaPods Compatible Carthage Compatible Platform Build Status License MIT

基于 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.frameworkJJNetwork.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 请求参数
  • responseSuccessresponseFail,网络响应

由客户密钥签名参数

- (NSString*)signParameterKey{
    return @"key";
}

如果实现 signParameterKey,则请求将添加两个参数,signtimestamp,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获取详细信息。