AFNetworking-based network library, with delegate to process network response, integrate more business and optimize network performance,中文使用说明,设计文档
Features
- Sign the http parameter by your customer key
 - Http cache for the GET and POST
 - Replace the domain to IP address improve performance and change customer http head field
 - Interseptor request and response
 - Support upload files
 - Mock request
 
Requirements
- iOS 8.0 or later
 - Xcode 7.3 or later
 
Installation
Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
pod 'JJNetwork'
end
run the following command:
$ pod install
Installation with Carthage
To integrate JJNetwork into your Xcode project using Carthage, specify it in your Cartfile:
github "jezzmemo/JJNetwork"
Run carthage to build the framework and drag the built AFNetworking.framework,JJNetwork.framework into your Xcode project.
Usage
JJAPIRequest
Every network request extends from JJAPIRequest,and then implement JJRequestInput protocol,overwrite some method.
For example:JJNetwork http://api.imemo8.com/diary.php send GET request,parameter: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- requestURL
 
Fill whole request URL,this method is required,other is optional
- requestMethod
 
return enum,POST,GET,PUT,DELETE,default is GET,if you did not implement
Parameter and Start request
#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- Invoke 
startRequestwill process network request - Implement 
requestParametersrequest parameter responseSuccessandresponseFail,network response
Sign parameter by the customer key
- (NSString*)signParameterKey{
    return @"key";
}If implement signParameterKey,request will add two parameters,sign and timestamp,sign = md5(parameters + timestamp + key)
Select cache policy for GET and POST
- (HTTPCachePolicy)requestCachePolicy{
    return JJReloadFromCacheTimeLimit;
}
//UNIT Second
- (NSUInteger)cacheLimitTime{
    return 120;
}- JJReloadFromNone: Default mode,request from network
 - JJReloadFromLocalCache: If have cache,will return the cache,if origin source update,will replace new data to old cache
 - JJReloadFromCacheTimeLimit: First time load request origin source,save the cache for the limit time,if expire,will return nil,if origin source update,will replace new data to old cache
 
If choose JJReloadFromCacheTimeLimit policy,you must implement cacheLimitTime
Final,Extends from JJAPIRequest any class,invoke cacheFromCurrentRequest method,for example:
id cacheData = [self.demoRequest cacheFromCurrentRequest];
NSLog(@"Local cache:%@",cacheData);
//show cache data
[self.demoRequest startRequest];
//request network and refresh UIReplace the domain to IP address improve performance and change customer http head field
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"};
}
@endRegister module to JJAPIService+Extension
[JJAPIService registerDomainIP:[[DomainModule alloc] init]];
[JJAPIService registerHttpHeadField:[[HttpHeadModule alloc] init]];Interseptor
- Implement from 
JJAPIServiceInterseptorto the instanceJJAPIServiceobject: 
- (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;For example:
[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");
}- Control Loading show/hide
 - AOP Request
 
Upload files
Support upload one or more files,UploadFileDemoRequest's 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"];
    };
}
@endViewController's 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;
}Implement requestFileBody method,add file information,This is upload file by HTTP, it is recommended to upload a smaller file
Mock request
Setup mock request and add mock request:
-(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 is released under the MIT license. See LICENSE for details.