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 的拼接与使用即可,出现问题易查找易处理。

上一篇下一篇

猜你喜欢

热点阅读