美文网首页iOS开发
iOS开发-网络-合理封装请求接口(一)AFNetWorking

iOS开发-网络-合理封装请求接口(一)AFNetWorking

作者: Geniune | 来源:发表于2018-04-19 12:53 被阅读171次

需要使用CocoaPods集成ReactiveCocoa/ReactiveObjcAFNetWorking
或直接下载我写的示例工程https://github.com/Geniune/LJAPI

创建AFHTTPSessionManager的Category,并import ReactiveObjC(建议写在PrefixHeader内),封装原本dataTaskWithHTTPMethod:方法转换为RACSignal

- (RACSignal *)signalForRequest:(NSString *)url method:(NSString *)method parameters:(NSDictionary *)params {
  return [[RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {//创建一个RACSignal

        NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:method URLString:url parameters:params uploadProgress:^(NSProgress *uploadProgress) {
        } downloadProgress:^(NSProgress *downloadProgress) {
        } success:^(NSURLSessionDataTask *task, id responseObject) {

            [subscriber sendNext:responseObject];//成功回调
            [subscriber sendCompleted];
        } failure:^(NSURLSessionDataTask *task, NSError *error) {

            [subscriber sendError:error];//失败回调
            [subscriber sendCompleted];
        }];

        [dataTask resume];

        return [RACDisposable disposableWithBlock:^{

            //当信号销毁,请求也取消
            [dataTask cancel];
        }];
  }] replayLazily];
}

创建BaseHttpClient类,实现:

  1. AFHTTPSessionManager对象初始化
  2. requestSerializer和responseSerializer属性设置
  3. 取消上一个/全部请求 方法
  4. 若使用HTTPS,SSL证书对应securityPolicy设置
- (void)requestURL:(NSString *)url params:(NSDictionary *)params method:(NSString *)method success:(void(^)(id responseObj))success failure:(void(^)(NSError *error))failure{
    //发起一个HTTP请求
    [[_http signalForRequest:url method:method parameters:params] subscribeNext:^(id  _Nullable x) {
        if(success){
            success(x);
        }
    } error:^(NSError * _Nullable error) {
        if (failure) {
            failure(error);
        }
    }];
}

创建HttpClient单例类,实现:

  1. BaseURL拼接 方法,当然也可以设置AFHTTPSessionManager的baseURL属性
  2. 入参params的加密 算法
  3. Get、Post、Put、Delete等具体 方法
- (void)requestWithPath:(NSString *)path params:(NSDictionary *)params method:(NSString *)method success:(void(^)(id responseObj))success failure:(void(^)(HttpException * e))failure{

    [self requestURL:path params:params method:method success:^(id responseObj) {

        NSInteger status = [[responseObj objectForKey:@"status"] integerValue];
        if(status == 200){

            //说明业务逻辑正常
            if(success){
                success(responseObj[@"data"]);
            }
        }else{

            //业务逻辑异常处理
            HttpException *e = [HttpException new];
            e.errorCode = status;
            e.message = [responseObj objectForKey:@"message"];

            if (failure) {
                failure(e);
            }
        }
    } failure:^(NSError *error) {

        HttpException *e = [HttpException new];
        e.errorCode = error.code;
        e.message = error.description;

        if (failure) {
            failure(e);
        }
    }];
}
- (void)get:(NSString *)url params:(NSDictionary *)params success:(void(^)(id responseObj))success failure:(void(^)(HttpException * e))failure{

    [self requestWithPath:url params:params method:@"GET" success:^(id responseObj) {

        if(success){
            success (responseObj);
        }

    } failure:^(HttpException *e) {

        if(failure){
            failure(e);
        }

    }];

}

- (void)post:(NSString *)url params:(NSDictionary *)params success:(void(^)(id responseObj))success failure:(void(^)(HttpException * e))failure{

    [self requestWithPath:url params:params method:@"POST" success:^(id responseObj) {

        if(success){
            success (responseObj);
        }

    } failure:^(HttpException *e) {

        if(failure){
            failure(e);
        }
    }];
}

创建一个异步POST请求:

NSString *API = @"https://www.example.com/?action=UserInfo";//接口URL

NSDictionary *param = @{@"user_id":@"9802"};//入参数据

[HttpClientMgr post:API params:param success:^(id responseObj) {

    //成功回调

} failure:^(HttpException *e) {

    //失败回调

}];

下篇将说明如何封装一个简单的业务API
链接:iOS开发-网络-合理封装请求接口(二)业务API接入实现

相关文章

网友评论

    本文标题:iOS开发-网络-合理封装请求接口(一)AFNetWorking

    本文链接:https://www.haomeiwen.com/subject/totwkftx.html