JJNetwork正式版發(fā)布

基于AFNetworking封裝的網(wǎng)絡庫,主要是為了滿足一些復雜App的網(wǎng)絡請求,并在層次劃分上比較清新,所有的網(wǎng)絡請求是數(shù)據(jù)提供者,還歸納了一些常見的功能封裝在里面(緩存,簽名...),設計文檔

特色功能

  • [x] 自定義Key簽名參數(shù)
  • [x] 緩存不止支持GET,還支持POST,根據(jù)自己的場景,自己選擇策略
  • [x] 支持用IP替換域名,達到提高網(wǎng)絡性能,支持HTTP HEAD設置
  • [x] 攔截網(wǎng)絡請求,方便攔截任意請求,復用請求,加入Loading

安裝環(huán)境

  • iOS 8.0以上
  • Xcode 7.3以上

如何安裝

Podfile

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target 'TargetName' do
pod 'JJNetwork'
end

執(zhí)行命令:

$ pod install

使用Carthage集成

在你的Cartfile文件里,加入以下內(nèi)容:

github "jezzmemo/JJNetwork"

AFNetworking.framework,JJNetwork.framework 兩個framework加入到自己的項目

如何使用

JJAPIRequest

每個網(wǎng)絡請求都是繼承JJAPIRequest,并按照JJRequestInput協(xié)議的方法,按照自己的需求,重寫(overwrite)指定的方法,來滿足自己的需求.

下面我用JJNetwork來向http://api.imemo8.com/diary.php發(fā)送一個GET請求,參數(shù)是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
    填寫一個完整的URL,繼承JJAPIRequest的時候,必須需要實現(xiàn)這個方法,其余方法都是可選的,

  • requestMethod
    返回一個枚舉類型,POST,GET,PUT,DELETE,如果不實現(xiàn),默認是GET

如何傳遞參數(shù)和調(diào)用

關于在哪初始化Request,這個根據(jù)自己的情況自己選擇,你可以在ViewController里調(diào)用,也可以再自己的中間層調(diào)用,這里給的例子是在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
  • 調(diào)用startRequest方法執(zhí)行網(wǎng)絡請求
  • 實現(xiàn)requestParameters來提供請求的參數(shù),網(wǎng)絡情況的輸入
  • responseSuccess和responseFail,網(wǎng)絡請求的輸出
  • 至于為什么選擇Delegate這種交互方式,傳送門

使用自定義Key簽名參數(shù),示例如下:

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

如果使用了signParameterKey方法,就會產(chǎn)生兩個參數(shù)signtimestamp,并且實現(xiàn)的方式是:md5(parameters + timestamp + key)

GET和POST都支持緩存,示例如下:

- (HTTPCachePolicy)requestCachePolicy{
    return ReloadFromCacheTimeLimit;
}

- (NSUInteger)cacheLimitTime{
    return 120;
}

如果選擇了ReloadFromCacheTimeLimit緩存策略,就必須實現(xiàn)cacheLimitTime方法,作用是你的緩存持續(xù)的時間,過期后將從網(wǎng)絡上重新請求,選擇其他兩種則不需要實現(xiàn)cacheLimitTime

  • ReloadFromNetwork: 只從網(wǎng)絡獲取
  • ReloadFromCacheElseLoadNetwork: 有緩存就從緩存獲取,沒有就從網(wǎng)路獲取
  • ReloadFromCacheTimeLimit: 緩存限定的時間范圍內(nèi)

支持用IP替換域名(服務器要支持IP訪問),達到提高網(wǎng)絡性能,支持HTTP HEAD設置

  • 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

并注冊到JJAPIRequest+Extension

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

這是兩個設置的接口,DomainModule是將域名替換成IP,減少了DNS的時間,從而提高訪問速度.

HttpHeadModule是設置全局的Head Field,根據(jù)自己的項目需要來決定是否需要設置.

攔截器的使用

  • JJAPIRequest實例化對象的requestInterseptor的屬性,并實現(xiàn)JJRequestInterseptor協(xié)議:
- (DemoRequest*)demoRequest{
    if (_demoRequest != nil) {
        return _demoRequest;
    }
    _demoRequest = [DemoRequest new];
    _demoRequest.delegate = self;
    _demoRequest.requestInterseptor = self;
    return _demoRequest;
}
  • JJAPIService 的擴展實現(xiàn)以下方法,可以監(jiān)聽任意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(@"網(wǎng)絡發(fā)送Request執(zhí)行前");
}

- (void)afterRequest:(JJAPIRequest*)request{
    NSLog(@"網(wǎng)絡發(fā)送Request執(zhí)行后");
}

- (void)request:(JJAPIRequest*)request beforeResponse:(id)data{
    NSLog(@"返回結果前");
}

- (void)request:(JJAPIRequest*)request afterResponse:(id)data{
    NSLog(@"返回結果后");
}

主要應用的兩個場景就是Loading的顯示和關閉,還有就是如果我需要用某個網(wǎng)絡請求的數(shù)據(jù),不需要改動原來的業(yè)務邏輯,只需要添加一份攔截即可,對已有的代碼不需要任何改動.

https://github.com/jezzmemo/JJNetwork

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • iOS網(wǎng)絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,490評論 1 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評論 25 709
  • 不記得現(xiàn)在哪里聽到或者看到過這句話:你吃第五個饅頭覺得飽了,不能說前四個都白吃了。 之前看的張滿勝的書,同學介紹...
    忽爾今至閱讀 275評論 0 0
  • 我形容不了青春它是個什么樣子,我也給不了青春任何有關的定義,但是總覺得它悲傷著快樂著,于是如果非要用什么來形容...
    生命不設限閱讀 259評論 0 0

友情鏈接更多精彩內(nèi)容