iOS開發(fā)中關(guān)于網(wǎng)絡(luò)框架應(yīng)用的理解

背景

今年一月份公司產(chǎn)品中加入支付模塊察纯,要求對接口徑加密操作,于是乎我們所有的接口都使用MD5加密各個(gè)參數(shù)幅慌,整個(gè)工程一共一百多個(gè)接口骗随,由于之前接口過于零散(原來接口是放在每個(gè)模塊的控制器中)。我花了將近一周的時(shí)間去完成這個(gè)事情艺挪,整個(gè)人都快瘋掉了不翩。于是在征求老大的意見后我們將接口全部集合在一個(gè)MKNetworkManager的文件中,在當(dāng)時(shí)覺得方案還不錯(cuò)在接口更換時(shí)我們隨時(shí)能很迅速的找到更換的接口,但是在項(xiàng)目需求依然在增加的情況下口蝠,文件代碼越來越多器钟,愈來愈顯得臃腫。代碼截圖如下:


{mk.h}.png

{mk.m}.png

如今文件的行數(shù)已突破2900行妙蔗,越來越覺得這個(gè)錯(cuò)誤的選擇傲霸,但是面對一百多個(gè)接口實(shí)在沒有勇氣去更改了。

新的方案

三月份公司業(yè)務(wù)發(fā)展需要我們又新建一個(gè)項(xiàng)目眉反,鑒于上個(gè)項(xiàng)目的教訓(xùn)昙啄。我對項(xiàng)目的網(wǎng)絡(luò)請求框架作了一下集成處理:
建一個(gè)基請求,所有的接口的數(shù)據(jù)都是有這一個(gè)部分傳輸過去的代碼如下:

//
//  YWRequest.h
//  YWCarOnline
//
//  Created by DeepWater on 16/3/29.
//  Copyright  2016年 DeepWater. All rights reserved.
//

#import <Foundation/Foundation.h>



@interface YWRequest : NSObject

/**
 *  上傳媒體文件
 *
 *  @param dediaData    文件數(shù)據(jù)
 *  @param urlString    鏈接
 *  @param parameter    參數(shù)
 *  @param successBlock 成功回調(diào)
 *  @param failBlock    失敗回調(diào)
 */
+ (void)uploadFileWithMediaData:(NSMutableArray *)dediaData
                      URLString:(NSString*)urlString
                 ReturnDataType:(ReturnDataType)returnDataType
                      Parameter:(NSMutableDictionary*)parameter
                   SuccessBlock:(SuccessBlock)successBlock
                      FailBlock:(FailBlock)failBlock;
/**
 *  接口獲取數(shù)據(jù)方式
 *
 *  @param urlString      鏈接
 *  @param parameter      參數(shù)
 *  @param requestType    請求方式
 *  @param returnDataType 返回?cái)?shù)據(jù)類型
 *  @param successBlock   成功回調(diào)
 *  @param failBlock      失敗回調(diào)
 */
+ (void)requestWithURL:(NSString *)urlString
             Parameter:(NSDictionary*)parameter
           RequestType:(RequestType) requestType
        ReturnDataType:(ReturnDataType)returnDataType
          SuccessBlock:(SuccessBlock)successBlock
             FailBlock:(FailBlock)failBlock;
@end

實(shí)現(xiàn)文件

//
//  YWRequest.m
//  YWCarOnline
//
//  Created by DeepWater on 16/3/29.
//  Copyright  2016年 DeepWater. All rights reserved.
//

#import "YWRequest.h"
/**
 *  正式環(huán)境
 */
static NSString * const hostName        =@"正式環(huán)境接口";
/**
 *  驗(yàn)收環(huán)境
 */
static NSString * const testHostName    =@"驗(yàn)收環(huán)境";
/**
 *  內(nèi)部局域網(wǎng)
 */
static NSString * const locailhostName  =@"內(nèi)部局域網(wǎng)";

@implementation YWRequest

+ (void)uploadFileWithMediaData:(NSMutableArray *)dediaData
                      URLString:(NSString*)urlString
                 ReturnDataType:(ReturnDataType)returnDataType
                      Parameter:(NSMutableDictionary*)parameter
                   SuccessBlock:(SuccessBlock)successBlock
                      FailBlock:(FailBlock)failBlock{
#ifdef isIOS9
    
    NSString*urlStringUTF8 =[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
#else
    NSString *urlStringUTF8 = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
#endif
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes =[NSSet setWithObjects:@"text/html",@"text/plain",@"application/json", nil];
    [manager POST:urlStringUTF8 parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        successBlock(dic);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failBlock(error);
    }];
}

/**
 *  新接口
 *
 *  @param urlString      接口類型
 *  @param parameter      參數(shù)
 *  @param requestType    請求方式
 *  @param returnDataType 返回類型:1.POST 2.GET
 *  @param successBlock   成功回調(diào)
 *  @param failBlock      失敗回調(diào)
 */
+ (void)requestWithURL:(NSString *)urlString
             Parameter:(NSDictionary*)parameter
           RequestType:(RequestType) requestType
        ReturnDataType:(ReturnDataType)returnDataType
          SuccessBlock:(SuccessBlock)successBlock
             FailBlock:(FailBlock)failBlock{
    NSString * path;
    /**
     *  0寸五,正式環(huán)境
     *  1梳凛,測試環(huán)境
     *  2,本地環(huán)境
     */
    NSInteger netType =0;
    switch (netType) {
        case 0:
            path = [NSString stringWithFormat:@"%@%@",hostName,urlString];
            break;
        case 1:
            path = [NSString stringWithFormat:@"%@%@",testHostName,urlString];
            break;
        case 2:
            path = [NSString stringWithFormat:@"%@%@",locailhostName,urlString];
            break;
            
    }
    //    DLog(@"path===%@",path);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes =[NSSet setWithObjects:@"text/html",@"text/plain",@"application/json", nil];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.responseSerializer = [[AFCompoundResponseSerializer alloc] init];
    if (returnDataType==JSONData) {
        manager.responseSerializer = [AFJSONResponseSerializer serializer];
    }else{
        manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    }
    if (requestType == GETType) {
        NSString * urlString;
        if ([YWToolManager isBlankString:parameter[kurl]]) {
            urlString = [NSString stringWithFormat:@"%@",path];
        }else{
            urlString = [NSString stringWithFormat:@"%@?%@",path,parameter[kurl]];
        }
       
#ifdef isIOS9 
        NSString*urlStringUTF8 =[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
#else
        NSString *urlStringUTF8 = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
#endif  
//            DLog(@"urlString==%@",urlString);
        [manager GET:urlStringUTF8 parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
//            DLog(@"%@",responseObject);
            successBlock(responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            failBlock(error);
        }];
    }else if (requestType == POSTType){
#ifdef isIOS9
        NSString*urlStringUTF8 =[path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
#else
        NSString *urlStringUTF8 = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
#endif
//        DLog(@"parameter==%@",parameter);
        [manager POST:urlStringUTF8 parameters:parameter progress:^(NSProgress * _Nonnull uploadProgress) {
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
//            NSString *result = [[NSString alloc] initWithData:responseObject  encoding:NSUTF8StringEncoding];
            successBlock(responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            failBlock(error);
        }];
    }
}

使用文件

//
//  YWCarListRequest.h
//  YWCarOnline
//
//  Created by DeepWater on 16/4/1.
//  Copyright  2016年 DeepWater. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "YWRequest.h"
typedef NS_ENUM(NSInteger,YWCarListRequestType) {
    getAllCarType,
    getDeveiceType,
    getCarDeviceLocationInfoType,
    getSearchDeviceType,
    getDeviceListType,
    getCarHistoryType,
};
@interface YWCarListRequest : NSObject

/**
 *  車輛列表請求接口
 *
 *  @param carListRequsetType 接口類型
 *  @param parameter          參數(shù)
 *  @param requestType        請求方式
 *  @param successBlock       成功回調(diào)
 *  @param failBlock          失敗回調(diào)
 */
+ (void)request:(YWCarListRequestType)carListRequsetType
      Parameter:(NSDictionary*)parameter
    RequestType:(RequestType) requestType
   SuccessBlock:(SuccessBlock)successBlock
      FailBlock:(FailBlock)failBlock;

@end

//
//  YWCarListRequest.m
//  YWCarOnline
//
//  Created by DeepWater on 16/4/1.
//  Copyright  2016年 DeepWater. All rights reserved.
//

#import "YWCarListRequest.h"
#import "YWDictionaryParse.h"
/**
 *  車輛列表
 */
static NSString *const getAllCarState           = @"GetAllVehicle";

static NSString *const getDeveceList            = @"GetDeveceList";
/**
 *  實(shí)時(shí)軌跡
 */
static NSString *const getCarDeviceLocationInfo = @"GetCarDeviceLocationInfo";
/**
 *  搜索頁面
 */
static NSString *const getSearchDevice          = @"SearchDevice";
/**
 *  設(shè)備信息
 */
static NSString *const getDeviceList            = @"GetDeviceList";
/**
 *  歷史軌跡
 */
static NSString *const getCarHistory            = @"GetAllLocation";

@implementation YWCarListRequest

+ (void)request:(YWCarListRequestType)carListRequsetType
      Parameter:(NSDictionary*)parameter
    RequestType:(RequestType) requestType
   SuccessBlock:(SuccessBlock)successBlock
      FailBlock:(FailBlock)failBlock{
    NSString *typeString;
    switch (carListRequsetType) {
        case getAllCarType:
        case getSearchDeviceType:
            typeString =getAllCarState;
            break;
        case getDeveiceType:
            typeString =getDeveceList;
            break;
        case getCarDeviceLocationInfoType:
            typeString =getCarDeviceLocationInfo;
            break;
        case getDeviceListType:
            typeString =getDeviceList;
            break;
        case getCarHistoryType:
            typeString =getCarHistory;
            break;
            
    }
    [YWRequest requestWithURL:typeString
                    Parameter:parameter
                  RequestType:requestType
               ReturnDataType:JSONData
                 SuccessBlock:^(id returnValue) {
//                     DLog(@"%@",returnValue);
        successBlock(returnValue);
    } FailBlock:^(NSError *error) {
        failBlock(error);
//        NSString * test = [[NSString alloc]initWithData:error.userInfo[kbadRequstReason] encoding:NSUTF8StringEncoding];
//         DLog(@"設(shè)備列表接口錯(cuò)誤信息====%@",test);
    }];
}

@end

然而在處理webservices(好消息是這玩意要被淘汰了)接口做對接時(shí)候會出現(xiàn)contentType:application/json問題梳杏,你需要加上manager.requestSerializer = [AFJSONRequestSerializer serializer];感謝默默_前行幫助韧拒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秘狞,隨后出現(xiàn)的幾起案子叭莫,更是在濱河造成了極大的恐慌,老刑警劉巖烁试,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雇初,死亡現(xiàn)場離奇詭異,居然都是意外死亡减响,警方通過查閱死者的電腦和手機(jī)靖诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來支示,“玉大人刊橘,你說我怎么就攤上這事∷毯瑁” “怎么了促绵?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘴纺。 經(jīng)常有香客問我败晴,道長,這世上最難降的妖魔是什么栽渴? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任尖坤,我火速辦了婚禮,結(jié)果婚禮上闲擦,老公的妹妹穿的比我還像新娘慢味。我一直安慰自己场梆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布纯路。 她就那樣靜靜地躺著或油,像睡著了一般。 火紅的嫁衣襯著肌膚如雪感昼。 梳的紋絲不亂的頭發(fā)上装哆,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音定嗓,去河邊找鬼蜕琴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宵溅,可吹牛的內(nèi)容都是我干的凌简。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恃逻,長吁一口氣:“原來是場噩夢啊……” “哼雏搂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寇损,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凸郑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矛市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芙沥,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年浊吏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了而昨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡找田,死狀恐怖歌憨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墩衙,我是刑警寧澤务嫡,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站漆改,受9級特大地震影響植袍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜籽懦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氛魁。 院中可真熱鬧暮顺,春花似錦厅篓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惫恼,卻和暖如春档押,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祈纯。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工令宿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腕窥。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓粒没,卻偏偏與公主長得像,于是被迫代替她去往敵國和親簇爆。 傳聞我的和親對象是個(gè)殘疾皇子癞松,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,146評論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法入蛆,內(nèi)部類的語法响蓉,繼承相關(guān)的語法,異常的語法哨毁,線程的語...
    子非魚_t_閱讀 31,634評論 18 399
  • 第一次用枫甲、歡迎圍觀不回復(fù)、內(nèi)向 新買的蝴蝶吊墜到了 恰如以前的我挑庶、現(xiàn)在的我 最后一枚校園內(nèi)的禮物 我言秸、忘不掉你 七...
    獨(dú)愛你o閱讀 157評論 4 1
  • (醋溜藕片+酸辣涼粉+蘿卜排骨湯) 都說晚餐要清淡举畸,哈哈,我這夠清淡了吧凳枝。 醋溜藕片:1 先把藕切成薄片抄沮,沖洗干...
    xyz心若幽蘭閱讀 243評論 0 2
  • First critics first dictionary Samuel Jonson independence...
    去社閱讀 334評論 0 0