AFNetworking与项目中API的封装
2018-09-03 本文已影响0人
羊非鱼丶
AFNetworking与项目中API封装的那些事儿
关于 AFNetworking 的封装,网络中有铺天盖地的方案提供出来,当然既然标题说到了 AFNetworking ,我会在这里再啰嗦一遍我个人在开发当中采用的方式,一是为记录,而是读者如有看到不当之处还望不吝指教。开发当中的接口封装,看似一件不值得注意的小事,但是当涉及到的接口数量较多,维护当中需要频繁查看接口数据或者请求出错,需要确定接口返回的数据时,接口封装的价值就体现出来了。
下面先说一下我在开发当中所采用的 AFNetworking 的封装方式。
以单例的形式封装 AFNetworking
.h 文件当中声明需要的回调 block 和请求方法
//请求成功的回调
typedef void(^SuccessBlock)(id responseBody);
//请求失败的回调
typedef void(^FailureBlock)(NSError *error);
//上传进度
typedef void(^uploadProgress)(float progress);
//下载进度
typedef void(^downloadProgress)(float progress);
@interface APIManager : AFHTTPSessionManager
+(APIManager *)sharedManager;
#pragma mark - 请求方法
//对需要的请求进行声明
#pragma mark - login
-(void)requestLoginWithParams:(NSDictionary *)params successBlock:(SuccessBlock)successBlock withErrBlock:(FailureBlock)errBlock;
在.m 文件的方法实现当中,就需要实际用到接口,即需要用到接口封装类(对其的说明会放到下面)
static APIManager *requestManager;
+ (APIManager *)sharedManager {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
requestManager = [[APIManager alloc] init];
// 解析数据的格式
[[requestManager responseSerializer] setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/plain", @"text/html", nil]];
// 超时时间的设置
[requestManager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
requestManager.requestSerializer.timeoutInterval = 30.f;
[requestManager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
});
return requestManager;
}
#pragma mark - 请求失败的统一处理
- (void)requestFailedWithError:(NSError *)error errBlock:(FailureBlock)errorBlock{
// 做一些需要的处理.
if (error.code == -1001) {
NSLog(@"请求超时");
} else {
}
errorBlock(error);
}
#pragma mark - 请求成功的统一处理
- (void)requestSuccessWithData:(id)responObject successBlock:(SuccessBlock)successBlock{
// 做一些需要的处理 比如登录是否过期
successBlock(responObject);
}
#pragma mark - 请求方法
#pragma mark - login
-(void)requestLoginWithParams:(NSDictionary *)params successBlock:(SuccessBlock)successBlock withErrBlock:(FailureBlock)errBlock{
[requestManager GET:[URL_HOST stringByAppendingString:userLogin] parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[self requestSuccessWithData:responseObject successBlock:successBlock];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self requestFailedWithError:error errBlock:errBlock];
}];
}
这里只对普通的数据请求方法进行了说明,关于文件的上传与下载,万法同宗,这里就不贴出来了~~
API 的封装
下面是对 API 封装的说明
.h 文件中
//多开发环境的处理
#if DEBUG
#define URL_HOST @"http://xxx.xx.xx.xxx/"
#elif LOCAL
#define URL_HOST @"http://xxx.xx.xx.xxx/"
#elif RELEASE
#define URL_HOST @"http://xxx.xx.xx.xxx/"
#else
#define URL_HOST @"http://xxx.xx.xx.xxx/"
#endif
#pragma mark - 登录 API
extern NSString *const userLogin;
关于多开发环境的处理,很方便我们在测试环境与发布环境进行切换,从网上扒了篇文章,读者有兴趣的话就去看看吧。
.m 文件当中只需要将我们的 URL 赋值给声明的 userLogin 即可。
#pragma mark - 登录 API
NSString *const userLogin = @"user/login";
按照以上方法,我们只需要在网络请求管理类和 API 封装类当中处理 URL 的拼接与使用即可,出现问题易查找易处理。