《iOS組件化》之搭建基于AFNetworking的網(wǎng)絡(luò)請求框架

前言

AFNetworking為我們封裝了一系列的網(wǎng)絡(luò)服務(wù)鹃操,直接使用基本上可以滿足大多數(shù)需求棍丐。隨著需求不斷增加剔蹋,架構(gòu)不斷完善添坊,直接使用AFNetworking未免會代碼冗余别凹,于是就出現(xiàn)了各種對AFNetworking的二次封裝辉川。

現(xiàn)有的AFNetworking二次封裝優(yōu)秀框架

  • YTKNetworking
    YTKNetwork是基于AFNetworking的高級請求實(shí)用,適用于稍微復(fù)雜的項(xiàng)目叶沛,而不適用于簡單的個人項(xiàng)目
  • PPNetworkHelper
    PPNetworkHelper對AFNetworking 3.x 與YYCache的二次封裝,封裝常見的GET惰赋、POST硫眯、文件上傳/下載蕴侧、網(wǎng)絡(luò)狀態(tài)監(jiān)測的功能、方法接口簡潔明了,并結(jié)合YYCache實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)的緩存,簡單易用,不用再寫FMDB那煩人的SQL語句,一句代碼搞定網(wǎng)絡(luò)數(shù)據(jù)的請求與緩存. 無需設(shè)置,無需插件,控制臺可直接打印json中文字符,調(diào)試更方便
  • XMNetworking
    XMNetworking是一個輕量的两入,簡單易用但功能強(qiáng)大的網(wǎng)絡(luò)庫

一套適合公司業(yè)務(wù)的網(wǎng)絡(luò)框架

YTKNetworkingPPNetworkHelper都是面向相對復(fù)雜的項(xiàng)目而生净宵,我們沒用到緩存部分,同時我們更傾向于輕量級的網(wǎng)絡(luò)框架裹纳。但是我們又崇尚YTKNetworking那樣的風(fēng)格择葡,結(jié)合當(dāng)前項(xiàng)目架構(gòu),借鑒 XMNetworking剃氧,于是寫了能cover住的HKHttpManager敏储。

解釋 HKHttpManager

HKHttpManagerconfigurelogger朋鞍、manager已添、response妥箕、request組成。

  • request的組成
/**
 請求 Base URL更舞,優(yōu)先級高于 [HKHttpConfigure generalServer];
 */
@property (nonatomic, copy) NSString *baseURL;

/**
 請求路徑 eg: /login2
 */
@property (nonatomic, copy) NSString *requestURL;

/**
 請求頭畦幢,默認(rèn)為空 @{}
 */
@property (nonatomic, strong) NSDictionary *requestHeader;

/**
 請求參數(shù),加密參數(shù) 默認(rèn)為空 @{}
 */
@property (nonatomic, strong) NSDictionary *encryptParams;

/**
 請求參數(shù)疏哗,不用加密 默認(rèn)為 @{}
 */
@property (nonatomic, strong) NSDictionary *normalParams;

/**
 請求方式 默認(rèn)為 HKRequestTypePost
 */
@property (nonatomic, assign) HKHttpRequestType requestMethod;


/**
 請求方式string
 */
@property (nonatomic,copy) NSString *requestMethodName;

/**
 請求超時時間 默認(rèn) 30s
 */
@property (nonatomic, assign) NSTimeInterval reqeustTimeoutInterval;

/**
 api 版本號呛讲,默認(rèn) 1.0
 */
@property (nonatomic, copy) NSString *apiVersion;

/**
 重試次數(shù)禾怠,默認(rèn)為 0
 */
@property (nonatomic, assign) UInt8 retryCount NS_UNAVAILABLE;

/**
 生成請求
 
 @return NSURLRequest
 */
- (NSURLRequest *)generateRequest;

三個Request類

以上屬性都可以再在初始化之后設(shè)置返奉,并且都設(shè)置了默認(rèn)值。同時有些相同的部分你也可以修改generateRequest,無論是chainRequest還是groupRequest都需要以HKHttpRequest為請求request吗氏。chainRequestgroupRequest某種意義上都是為了在HKHttpmanager調(diào)用方便而封裝芽偏。

  • HKHttpmanager組成
    HKHttpManager主要提供發(fā)起請求接口,普通請求可通過block賦值request弦讽。
/**
 直接進(jìn)行請求污尉,不進(jìn)行參數(shù)及 url 的包裝
 
 @param request 請求實(shí)體類
 @param result 響應(yīng)結(jié)果
 @return 該請求對應(yīng)的唯一 task id
 */
- (NSString *_Nullable)sendRequest:(nonnull HKHttpRequest *)request complete:(nonnull HKHttpResponseBlock) result;


/**
 發(fā)送網(wǎng)絡(luò)請求,緊湊型
 
 @param requestBlock 請求配置 Block
 @param result 請求結(jié)果 Block
 @return 該請求對應(yīng)的唯一 task id
 */
- (NSString *_Nullable)sendRequestWithConfigBlock:(nonnull HKRequestConfigBlock )requestBlock complete:(nonnull HKHttpResponseBlock) result;
  • HKHttpManager+GroupHKHttpManager+Chain
    特意將GroupChain封裝成了類別往产,單獨(dú)處理HKHTTPGroupRequest被碗、HKHttpChainRequest并行串行等關(guān)系,在這里將request序列化仿村,再調(diào)用sendRequest:請求锐朴。
- (NSString *)sendGroupRequest:(nullable HKGroupRequestConfigBlock)configBlock
                      complete:(nullable HKGroupResponseBlock)completeBlock;


- (void)cancelGroupRequest:(NSString *)taskID;
@end
結(jié)構(gòu)圖.png

使用 HKHttpManager

普通 request
  1. #import "HKHttpManagerHeader.h",建議在APPDelegate初始化baseURL
[HKHttpConfigure shareInstance].generalServer = @"https://www.apiopen.top/";
  1. 根據(jù)需要設(shè)置公共請求頭generalHeaders、公共參數(shù)generalParameters
[HKHttpConfigure shareInstance].generalHeaders = @{@"token":token};
[HKHttpConfigure shareInstance].generalParameters = @{@"openid":@"xxx"};
  1. 構(gòu)建request
HKHttpRequest *request = [[HKHttpRequest alloc] init];
    request.requestURL = @"satinApi";
    request.normalParams = @{@"type":@"1",
                             @"page":@"1"
                             };
    request.requestMethod = HKHttpRequestTypeGet;

4.發(fā)起請求

 [[HKHttpManager shareManager] sendRequest:request complete:^(HKHttpResponse * _Nullable response) {
        NSLog(@"%@",response.content);
    }];

或者在block里構(gòu)建request

 [[HKHttpManager shareManager] sendRequestWithConfigBlock:^(HKHttpRequest * _Nullable request) {
        request.requestURL = @"satinApi";
        request.normalParams = @{@"type":@"1",
                                 @"page":@"1"
                                 };
        request.requestMethod = HKHttpRequestTypeGet;
    } complete:^(HKHttpResponse * _Nullable response) {
        if (response.status == HKHttpResponseStatusSuccess) {
            NSLog(@"%@",response.content);
        }
    }];
使用chainQequest實(shí)現(xiàn)鏈?zhǔn)秸埱?/h5>
[[HKHttpManager shareManager] sendChainRequest:^(HKHttpChainRequest * _Nullable chainRequest) {
        [chainRequest onFirst:^(HKHttpRequest * _Nullable request) {
            request.requestURL = @"satinApi";
            request.normalParams = @{@"type":@"1",
                                     @"page":@"1"
                                     };
            request.requestMethod = HKHttpRequestTypeGet;
        }];
        [chainRequest onNext:^(HKHttpRequest * _Nullable request, HKHttpResponse * _Nullable responseObject, BOOL * _Nullable isSent) {
            request.requestURL = @"satinApi";
            request.normalParams = @{@"type":@"1",
                                     @"page":@"2"
                                     };
            request.requestMethod = HKHttpRequestTypeGet;
        }];
        [chainRequest onNext:^(HKHttpRequest * _Nullable request, HKHttpResponse * _Nullable responseObject, BOOL * _Nullable isSent) {
            request.requestURL = @"satinApi";
            request.normalParams = @{@"type":@"1",
                                     @"page":@"3"
                                     };
            request.requestMethod = HKHttpRequestTypeGet;
        }];
        
    } complete:^(NSArray<HKHttpResponse *> * _Nullable responseObjects, BOOL isSuccess) {
        
    }];

使用groupQequest實(shí)現(xiàn)無序批量請求

 [[HKHttpManager shareManager] sendGroupRequest:^(HKHttpGroupRequest * _Nullable groupRequest) {
        for (NSInteger i = 0; i < 5; i ++) {
            HKHttpRequest *request = [[HKHttpRequest alloc] init];
            request.requestURL = @"satinApi";
            request.normalParams = @{@"type":@"1",
                                     @"page":@"1"
                                     };
            request.requestMethod = HKHttpRequestTypeGet;
            [groupRequest addRequest:request];
        }
    } complete:^(NSArray<HKHttpResponse *> * _Nullable responseObjects, BOOL isSuccess) {
        
    }];

TODO

HKHttpManager目前能滿足公司的業(yè)務(wù)蔼囊,但是許多細(xì)節(jié)方面還需優(yōu)化焚志,例如:

  1. 實(shí)現(xiàn)斷點(diǎn)續(xù)傳
  2. groupRequestchainRequestrequest一致,支持兩種請求方式(目前只能在block中對groupRequest畏鼓、chainRequest賦值)酱酬。
  3. configure這方面還需要優(yōu)化,增加對request默認(rèn)請求的配置

End

GitHub地址在這里: HKHttpManager
謝謝各位閱讀云矫,能力有限膳沽,希望大家能多提點(diǎn)優(yōu)化建議和看法!

我的組件化系列文章:
《iOS組件化》組件化實(shí)踐
《iOS組件化》組件的劃分
《iOS組件化》創(chuàng)建公共/私有 Pods
《iOS組件化》之使用AOP代替繼承
《iOS組件化》之 搭建適合業(yè)務(wù)的URL跳轉(zhuǎn)路由-ALRouter

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末让禀,一起剝皮案震驚了整個濱河市挑社,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堆缘,老刑警劉巖滔灶,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吼肥,居然都是意外死亡录平,警方通過查閱死者的電腦和手機(jī)麻车,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斗这,“玉大人动猬,你說我怎么就攤上這事”砑” “怎么了赁咙?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長免钻。 經(jīng)常有香客問我彼水,道長,這世上最難降的妖魔是什么极舔? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任凤覆,我火速辦了婚禮,結(jié)果婚禮上拆魏,老公的妹妹穿的比我還像新娘盯桦。我一直安慰自己,他們只是感情好渤刃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布拥峦。 她就那樣靜靜地躺著,像睡著了一般卖子。 火紅的嫁衣襯著肌膚如雪略号。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天揪胃,我揣著相機(jī)與錄音璃哟,去河邊找鬼。 笑死喊递,一個胖子當(dāng)著我的面吹牛随闪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骚勘,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼铐伴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俏讹?” 一聲冷哼從身側(cè)響起当宴,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泽疆,沒想到半個月后户矢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殉疼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年梯浪,在試婚紗的時候發(fā)現(xiàn)自己被綠了捌年。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡挂洛,死狀恐怖礼预,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虏劲,我是刑警寧澤托酸,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站柒巫,受9級特大地震影響励堡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吻育,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一念秧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧布疼,春花似錦、人聲如沸币狠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漩绵。三九已至贱案,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間止吐,已是汗流浹背宝踪。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碍扔,地道東北人瘩燥。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像不同,于是被迫代替她去往敵國和親厉膀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 想想現(xiàn)在的自己二拐,會不會在某一個瞬間毫無征兆的跳出一個念頭服鹅,如果當(dāng)初我沒有這樣選擇會發(fā)生些什么。我曾無數(shù)次想過將來我...
    小雨沒話說閱讀 431評論 1 2
  • 大學(xué)四年美好時光,讀了一些書藻治,看了一些視頻碘勉。有令人怦然心動的愛情, 有令人捧腹大笑的故事桩卵,有令人凄然淚下的悲情验靡,但...
    拾八日記閱讀 1,614評論 2 4
  • 本來計(jì)劃在元旦的時候發(fā)表自己在簡書的第一篇文章胜嗓,由于種種原因一直拖到現(xiàn)在才來寫;自己的文筆不好钩乍,上學(xué)的時候也最愁寫...
    影子籃球工作室閱讀 266評論 0 1
  • 時光有時候會停下來認(rèn)你等待辞州,然后讓你欣賞。所以要好好珍惜寥粹。 暑假很愉快 傾聽自己的聲音和夢想变过。 讓生活慢下來,好好...
    易安石子閱讀 503評論 2 4