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