Code Monkey home page Code Monkey logo

jjnetwork's Introduction

CocoaPods Compatible Carthage Compatible Platform Build Status License MIT

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 startRequest will process network request
  • Implement requestParameters request parameter
  • responseSuccess and responseFail,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 UI

Replace 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"};
}
@end
  • JJAPIHttpHeadModule
@interface HttpHeadModule : NSObject<JJAPIHttpHeadModule>

@end
@implementation HttpHeadModule

- (NSDictionary*)customerHttpHead{
    return @{@"user-token":@"xxxxx",@"device-id":@"xxxxx"};
}

@end

Register module to JJAPIService+Extension

[JJAPIService registerDomainIP:[[DomainModule alloc] init]];
[JJAPIService registerHttpHeadField:[[HttpHeadModule alloc] init]];

Interseptor

  • Implement from JJAPIServiceInterseptor to the instance JJAPIService object:
- (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"];
    };
}

@end

ViewController'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.

jjnetwork's People

Contributors

jezzmemo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

ssunnyy zzscc

jjnetwork's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.