美文网首页
AFNetworking与项目中API的封装

AFNetworking与项目中API的封装

作者: 羊非鱼丶 | 来源:发表于2018-09-03 15:59 被阅读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 的拼接与使用即可,出现问题易查找易处理。

    相关文章

      网友评论

          本文标题:AFNetworking与项目中API的封装

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