在使用网络请求的过程中,可以使用系统的框架、ASI、AFN、MK等,但是如果需要更换项目的网络请求框架(比如,项目之前用的ASI框架,现在需要更换为AFN),那么这将是一个好大的工程,项目初期,怎么搭建网络请求框架,才可以让修改网络请求的工程量减到最小呢,这是我们今天要说的问题。
网络请求框架一共三层:
第三层:ASI、AFN或者其它网络请求方式,
第二层:第二层分有基类与类别(Category)构成,基类用于共有参数与发起请求,分类则是为了团队开发与结构清晰
第一层:即应用层,比如一个登录、注册操作,需要从界面上获得参数,并配合回调。
1)首先需要遭到这几种网络请求中,最大的不同是什么?
ASI、AF在使用时,最大的不同就是他们的初始化方法,所以我们首先将这一层封装出来,作为框架的第二层的基类。基类中进行共有参数的配置以及发起请求,也可以有多种发起请求的方法。比如说项目中需要用到GET、POST同步异步请求,都可以在基类中配置并公开。
如:初始化AFN(第三层),配置参数并发起post异步请求的基类方法;
+(void)sendPostRequestWithMethod:(NSString *)method parameters:(NSDictionary *)parameters callback:(Callback)callback{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@“text/html”];
manager POST:Base_Url(method) parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
if(callback) {
callback(1,nil);
return;
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if(callback) {
callback(0,error);
return;
}
}
}
2)每一个网络请求的参数与请求地址配置
在项目中,我们可能会发起上白哥网络请求的地址都不同,参数也不同,接口对参数的格式的要求也就不同,比如登录操作,可能需要对密码进行加密,一串数字可能需要用“_”进行拼接等,呢么这个参数在View层中配置好不好呢,当然也可以,但是不够清晰,东一个西一个,后台修改了参数格式以后,要到界面代码中找很久,那么我给出的解决办法是:将参数与地址配置在第二层的类目中,View层只需要引入泪目的头文件,传入未经过处理的参数,然后由泪目中的方法来进行配置即可,代码如下:
@implementation RequestBase (LoginRequest)
/**
@param username 用户名
@param password 为进行加密处理的密码
@param callback 完成网络请求的回调
*/
+ (void)senLoginRequestWithUsename:(NSString *)username password:(NSString *)password callback:(Callback )callback {
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
[parameters setObject:username forKey:@“username”];
[parameters setObject:password forKey:@“password”];
[RequestBase senGetRequestWithMethod:@“login”parameters:parameters callback:callback];
}
@end
3)View层发起网络请求与回调处理(登录为例)
当登录按钮点击时进行网络请求
/**
登录按钮点击响应事件
@param sender 登录按钮
*/
- (void)loginButtonPressed:(UIButton *)sender {
//发起登录请求,将参数传递至第二层,进行详细配置(如password的加密等操作)
[RequestBase sendLoginRequesrWithUsername:@“Jane Doe”password:@“password” callback:^(NSError *error, NSMutableDictionary *result){
//判断回调是否失败活着返回值是否为字典,(也可将判断步骤放在第二层基类中)
if(!error && [result idkindOfClass:[NSDictionary class]]) {
NSLog(@“登录成功”);
}
}];
}
那么到此,三层网络请求的框架已经搭建完成,结构清晰,用法简单,如果遇到需要更换网络请求的情况,仅需要将第三层换掉,第二层基类中,更换初始化网咯请求方式即可,其余代码完全不用替换。