基于AFNetworking的網(wǎng)絡(luò)請求管理-YRequestManager

移步Github:YRequestManager

Logo


YRequestManager

Base AFNetworking Core Network Request Framework

Description


簡介

基于AFNetworking作為網(wǎng)絡(luò)請求核心休雌,封裝的網(wǎng)絡(luò)請求管理工具命咐。通過Api類作為請求配置描述,Manager做為管理發(fā)送方來發(fā)出請求勃痴;默認(rèn)提供了三個攔截器:NetworkProtocalInterceptor(錯誤后處理狀態(tài)碼斗塘,網(wǎng)絡(luò)層),ReqLogInterceptor(發(fā)起請求前打印日志),RespSucInterceptor(響應(yīng)成功后做數(shù)據(jù)轉(zhuǎn)實體媚值,可用第三方轉(zhuǎn)換工具);RequestManager提供了默認(rèn)實例化方法:defaultMamanger护糖,會把默認(rèn)的三個攔截器加入進(jìn)來褥芒,如果項目中不想用這三個攔截器,或不滿足需求嫡良,可繼承他們的父類自己重寫锰扶,當(dāng)然,RequestManager的實例化方法也要改為:initManagerWithYDelegate寝受。

pod 使用

pod search YRequestManager
pod 'YRequestManager'

結(jié)構(gòu)概覽

1.ApiDelegate
2.AbsApi
3.BaseApi
4.BaseServiceManager
5.RequestManager

詳解

1.ApiDelegate Protocal協(xié)議

該協(xié)議規(guī)范了凡遵守該協(xié)議的Api對象都擁有getReqUrl,getReqHeader,getReqBody,getRequestMethod,getTimeOut方法坷牛。這種設(shè)計方式借鑒了Java,C#語法的Interface接口的設(shè)計思想很澄。

  • getReqUrl 用來配置請求地址Url京闰,遵守者實現(xiàn)該方法需返回一個NSString對象颜及。
  • getReqHeader 用來配置請求Header,遵守者實現(xiàn)該方法需返回一個NSDictionary對象蹂楣。
  • getReqBody 用來配置請求Body俏站,遵守者實現(xiàn)該方法需返回一個NSDictionary對象。
  • getRequestMethod用來配置該請求方式痊土,用enum枚舉RequestMethod來區(qū)分肄扎,可返回RequestMethodPOST(Post請求)、RequestMethodGET(Get請求)RequestMethodPUT(Put請求)赁酝、RequestMethodDELETE(Delete請求)犯祠。
  • getTimeOut 用來配置請求超時時間。


2.AbsApi abstract抽象類

請求抽象類赞哗,規(guī)范了繼承自AbsApi需要實現(xiàn)的方法雷则。這種設(shè)計方式借鑒了Java,C#語法的abstract抽象類的設(shè)計思想肪笋。

  • getRootUrl 請求域名url月劈。默認(rèn)為nil,遵守實現(xiàn)者必須實現(xiàn)藤乙。
  • getPath 請求url后半部分猜揪。默認(rèn)為nil,遵守實現(xiàn)者必須實現(xiàn)坛梁。
  • getBaseHeader 基本header而姐。默認(rèn)為nil,若有每個請求必填的header字段划咐,請實現(xiàn)此方法拴念。
  • getHeader 基本header以外的請求header。默認(rèn)為nil褐缠,遵守實現(xiàn)者必須實現(xiàn)政鼠。
  • getBaseBody 基本body。默認(rèn)為nil队魏,若有每個請求必填的body字段公般,請實現(xiàn)此方法。
  • getBody 基本body以外的請求body胡桨。默認(rèn)為nil官帘,遵守實現(xiàn)者必須實現(xiàn)
  • getRespClass 用來指定該請求返回的數(shù)據(jù)實體Class,遵守者重寫該方法需返回一個Class類型[Entity class]昧谊,將返回的數(shù)據(jù)轉(zhuǎn)換成指定數(shù)據(jù)實體對象刽虹。同時在同一頁面中發(fā)起n個不同api請求后,返回的數(shù)據(jù)揽浙,我們可以通過class來區(qū)別状婶。


3.BaseApi 請求Api基類

請求基類意敛,繼承自AbsApi,且遵守了ApiDelegate協(xié)議膛虫。
內(nèi)部實現(xiàn)了ApiDelegate協(xié)議的方法草姻,大家使用時直接繼承BaseApi。而如果BaseApi如果不符合你的口味稍刀,你可以來自定義一個繼承AbsApi又遵守BaseApiDelegate協(xié)議的對象


4.BaseServiceManager

用來使用AFNetWorking發(fā)送請求撩独,只是個管理者,本身并不具備發(fā)送請求能力账月;目前依賴于AFNetWorking來發(fā)送網(wǎng)絡(luò)請求综膀;在內(nèi)部封裝了一些默認(rèn)創(chuàng)建AFHTTPSessionManager的方法。

/// 使用block方式發(fā)送數(shù)據(jù)請求局齿;api:發(fā)送參數(shù)剧劝,sucBlock:成功回調(diào),failBlock:失敗回調(diào)
- (void)request:(AbsApi<ApiDelegate>*)api
       sucBlock:(RespSucBlock)sucBlock
      failBlock:(RespFailBlock)failBlock;

該方法使用Block回調(diào)來發(fā)送請求抓歼,api參數(shù)為繼承AbsApi抽象類讥此,且遵守ApiDelegate協(xié)議的對象,(PS:BaseApi就符合該約束谣妻,凡繼承BaseApi的對象都符合該參數(shù)約束) BaseServiceManager內(nèi)部通過api對象配置來發(fā)送請求萄喳。sucBlockfailBlock為請求成功/失敗回調(diào)蹋半。


5.RequestManager

繼承自BaseServiceManager他巨;設(shè)計此Manager主要目的是,后期不采用AFNetWorking時减江,可在本類的發(fā)送方法sendRequest...中切換其他第三方請求框架即可染突,而不需要項目中到處修改AFNetWorking請求為其他方式請求,同時擔(dān)任著控制第三方請求的角色辈灼;因此觉痛,即使看不慣本類,也不要修改茵休;另外,本類增加了Protocal回調(diào)數(shù)據(jù)方式請求手蝎。

/// ResponseDelegate 數(shù)據(jù)響應(yīng)回調(diào)協(xié)議
@property (nonatomic,assign) id<YResponseDelegate> ydelegate;

+ (id)initManagerWithDelegate:(id<ResponseDelegate>)delegate;
/// 發(fā)送數(shù)據(jù)請求榕莺,參數(shù)為繼承AbsApi抽象類,且遵守BaseApiDelegate協(xié)議 的對象
- (void)sendRequest:(AbsApi<ApiDelegate>*)api;

我們可以直接使用initManagerWithYDelegate:或者defaultManager方法來初始化RequestManager對象棵介,將數(shù)據(jù)回調(diào)協(xié)議delegate傳入钉鸯。

使用request:方法來發(fā)送請求,同父類一致邮辽,api參數(shù)為繼承AbsApi抽象類唠雕,且遵守BaseApiDelegate協(xié)議的對象贸营。而上述BaseApi就符合這一點,而BaseApi如果不符合你的口味岩睁,你可以來自定義一個繼承AbsApi又遵守BaseApiDelegate協(xié)議的對象钞脂。









使用方式

1.Api配置類

  • Api配置類使用
// 導(dǎo)入
#import "BaseApi.h"

// PokemonBaseApi繼承自BaseApi
@implementation PokemonBaseApi

- (NSString *)getRootUrl
{
    return @"https://pokevision.com/";
}

- (int)getTimeOut
{
    return 30;
}

- (int)getRequestMethod
{
    return RequestMethodGET;
}

- (NSString *)checkRespData:(id)data
{
    PokemonBaseDo *pokemon = data;
    NSString *status = pokemon.status;
    if(![status isEqualToString:@"success"]){
        return @"查詢失敗";
    }
    return nil;
}
@end
// PokemonPositionApi繼承自PokemonBaseApi
@implementation PokemonPositionApi

- (NSString *)getPath
{
    return @"map/data/34.00/-118.5";
}

- (NSDictionary *)getBody
{
    return @{@"User":_user,@"Pwd":_pwd};
}

- (Class)getRespClass
{
    return [PkPositionDo class];
}

- (int)getRequestMethod
{
    return RequestMethodGET;
}

@end

  • Api配置類的實例化

// 初始化要請求的接口配置
PokemonPositionApi *api = [[PokemonPositionApi alloc]init];
// 設(shè)置配置:請求body參數(shù)
api.user = @"andy";
api.pwd = @"pwd";







2.RequestManager請求

  • RequestManager請求

#import "RequestManager.h"

// 初始化請求管理類
RequestManager *reqManager = [RequestManager defaultManager:self];
// 添加響應(yīng)成功后,數(shù)據(jù)轉(zhuǎn)換實體方式攔截器
[reqManager setInterceptorForSuc:[DataConvertInterceptor new]];
// 發(fā)送請求:Protocol方式接收數(shù)據(jù)
[reqManager request:api];

// 發(fā)送請求:Block方式接收數(shù)據(jù)
[reqManager request:api sucBlock:^(CentaResponse *result) {
        if(result.suc){
            PkPositionDo *position = result.data;
            NSString *status = position.status;
            NSLog(status);
        }else{
            NSLog(result.msg);
        }
    } failBlock:^(CentaResponse *error) {
        NSLog(error.msg);
    }];



  • DataConvertInterceptor (繼承自InterceptorForRespSuc)

    DataConvertInterceptor并非框架自帶捕儒,因為框架不應(yīng)該綁架業(yè)務(wù)層使用什么做數(shù)據(jù)轉(zhuǎn)換冰啃,
    因此,這個過程開放出來刘莹,自行決定阎毅。(示例代碼中是使用yyModel轉(zhuǎn)換)


@implementation DataConvertInterceptor

- (CentaResponse *)convertData:(id)task andRespData:(id)respData andApi:(AbsApi<ApiDelegate> *)api
{
    CentaResponse *resp =  [super convertData:task andRespData:respData andApi:api];
    NSDictionary *dic = resp.data;
    
    // 使用yymodel轉(zhuǎn)換成目標(biāo)實體
    Class cls = api.getRespClass;
    resp.data = [cls yy_modelWithDictionary:dic];
    
    return resp;
}
@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市点弯,隨后出現(xiàn)的幾起案子扇调,更是在濱河造成了極大的恐慌,老刑警劉巖抢肛,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狼钮,死亡現(xiàn)場離奇詭異,居然都是意外死亡雌团,警方通過查閱死者的電腦和手機(jī)燃领,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锦援,“玉大人猛蔽,你說我怎么就攤上這事×樗拢” “怎么了曼库?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長略板。 經(jīng)常有香客問我毁枯,道長,這世上最難降的妖魔是什么叮称? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任种玛,我火速辦了婚禮,結(jié)果婚禮上瓤檐,老公的妹妹穿的比我還像新娘赂韵。我一直安慰自己,他們只是感情好挠蛉,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布祭示。 她就那樣靜靜地躺著,像睡著了一般谴古。 火紅的嫁衣襯著肌膚如雪质涛。 梳的紋絲不亂的頭發(fā)上稠歉,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音汇陆,去河邊找鬼怒炸。 笑死,一個胖子當(dāng)著我的面吹牛瞬测,可吹牛的內(nèi)容都是我干的横媚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼月趟,長吁一口氣:“原來是場噩夢啊……” “哼灯蝴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孝宗,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤穷躁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后因妇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體问潭,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年婚被,在試婚紗的時候發(fā)現(xiàn)自己被綠了狡忙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡址芯,死狀恐怖灾茁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谷炸,我是刑警寧澤北专,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站旬陡,受9級特大地震影響拓颓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜描孟,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一驶睦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匿醒,春花似錦啥繁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酬核。三九已至蜜另,卻和暖如春适室,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背举瑰。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工捣辆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人此迅。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓汽畴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耸序。 傳聞我的和親對象是個殘疾皇子忍些,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)坎怪,斷路器罢坝,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,002評論 6 13
  • 你是有名的實干家,朝五晚九搅窿,馬不停蹄嘁酿,無私奉獻(xiàn),嘔心瀝血男应,很用力很用力的仿佛要把一切的一切做到“完美”(這...
    舒驊閱讀 153評論 0 0