网络请求--对AFN的封装

作者: 倚楼听风雨wing | 来源:发表于2016-07-04 10:31 被阅读1386次

    网络框架封装##

    查看AFN的源码会发现,AFN这套框架内部的GET,POST,DELETE,PUT,HEAD,PACH等方法都走了一个主方法,可是在AFN的头文件中却没有这个方法的声明,也就是说我们外部不能直接访问.

    我的网络框架###

    创建一个WYNetworkTool继承自AFHTTPSessionManager,然后在.h中编写如下代码

    typedef enum : NSUInteger {
        WYNetworkMethodGET = 0, 
        WYNetworkMethodPOST
    } WYNetWorkMethod;
    /// 网络请求回调类型
    ///
    /// @param result 返回结果
    /// @param error  错误信息
    typedef void (^WYRequestCallBack)(id result, NSError *error);
    
    @interface WYNetWorkTool : AFHTTPSessionManager
    
    + (instancetype)sharedNetworkTool;
    
    /// 网络请求,封装了GET和POST
    ///
    /// @param method     枚举,GET/POST
    /// @param URLString  baseURL之后的地址
    /// @param parameters 请求参数
    /// @param finished   返回回调
    - (void)requestWithMethod:(WYNetWorkMethod)method URLString:(NSString *)URLString parameters:(id)parameters finished:(WYRequestCallBack)finished;
    

    在.m中编写如下代码.解释:因为在AFN内部的主方法没有暴露在.h中所以我们无法直接访问,可以通过定义协议,然后遵守协议,再直接调用该内部方法.这里主要就是因为AFHTTPSessionManager实现了该方法,OC做为动态类型语言,在使用该方法的时候是能够动态的找到的.我们这里的协议想到于对方法做一个前置生命,使其编译器不会报错.

    #import "WYNetWorkTool.h"
    
    NSString *const Course_Base_URL = @"https://api.coursera.org/";
    
    @protocol WYNetworkToolProxy <NSObject>
    
    @optional
    /// AFN 内部的数据访问方法
    ///
    /// @param method           HTTP 方法
    /// @param URLString        URLString
    /// @param parameters       请求参数字典
    /// @param uploadProgress   上传进度
    /// @param downloadProgress 下载进度
    /// @param success          成功回调
    /// @param failure          失败回调
    ///
    /// @return NSURLSessionDataTask,需要 resume
    - (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                           URLString:(NSString *)URLString
                                          parameters:(id)parameters
                                      uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
                                    downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
                                             success:(void (^)(NSURLSessionDataTask *, id))success
                                             failure:(void (^)(NSURLSessionDataTask *, NSError *))failure;
    
    @end
    
    @interface WYNetWorkTool() <WYNetworkToolProxy>
    
    @end
    
    @implementation WYNetWorkTool
    
    + (instancetype)sharedNetworkTool {
        static WYNetWorkTool *instance;
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:Course_Base_URL]];
        });
        
        return instance;
    }
    
    - (instancetype)initWithBaseURL:(NSURL *)url {
        self = [super initWithBaseURL:url];
        
        if (self) {
            [self.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
                NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
            }];
            [self.reachabilityManager startMonitoring];
            //        self.requestSerializer = [AFgzipRequestSerializer serializer];
            self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil];
            [(AFJSONResponseSerializer *)self.responseSerializer setRemovesKeysWithNullValues:YES];
        }
        return self;
    }
    
    /// 网络请求,封装了GET和POST
    ///
    /// @param method     枚举,GET/POST
    /// @param URLString  baseURL之后的地址
    /// @param parameters 请求参数
    /// @param finished   返回回调
    - (void)requestWithMethod:(WYNetWorkMethod)method URLString:(NSString *)URLString parameters:(id)parameters finished:(WYRequestCallBack)finished {
        URLString = URLString == nil ? @"" : URLString;
        NSString *methodName = (method == WYNetworkMethodGET) ? @"GET" : @"POST";
        NSString *urlStr = [NSString stringWithFormat:@"api/courses.v1/%@", URLString];
        
        [[self dataTaskWithHTTPMethod:methodName URLString:urlStr parameters:parameters uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
    
            finished(responseObject, nil);
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            
            NSLog(@"网络请求错误 %@", error.localizedDescription);
            
            finished(nil, error);
        }] resume];
    }
    
    @end
    
    

    相关文章

      网友评论

      • 棍武中原:用不了,不管什么接口都报unsupported URL;不是借口问题
      • 054ce4d15908:如果这样写啦,那网络请求失败后,想做一定的操作,就没办法啦,比如:提示网络请求失败咋处理啊
        054ce4d15908:@倚楼听风雨wing 谢啦,理解啦
        倚楼听风雨wing:在请求完成的回调中进行判断,如果error有值,就是网络请求错误
      • kinmo:有下载地址么
        kinmo:@倚楼听风雨wing 哦哦,谢谢
        倚楼听风雨wing:@July丶ye 你只需要下载了AFN这套框架到你的项目中,然后直接copy上面的.h和.m文件就可以

      本文标题:网络请求--对AFN的封装

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