zoukankan      html  css  js  c++  java
  • AFNetworking 2.5.x 网络请求的封装

    AFNetworking 2.5.x 网络请求的封装

    源码地址

    https://github.com/YouXianMing/Networking

    说明

    1. 将block形式的请求转换成用代理来处理

    2. 你可以通过继承父类,改写父类的某些方法来达到转换请求字典(加密或者其他事宜等),转换获取结果的目的(加密或者其他事宜等)

    3. 支持下载进度

    常规请求源码

    //
    //  Networking.h
    //  NetworkingCraft
    //
    //  Created by YouXianMing on 15/6/11.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    @class Networking;
    
    
    typedef enum : NSUInteger {
        
        GET_METHOD,                  // GET请求
        POST_METHOD,                 // POST请求
        
    } AFNetworkingRequestMethod;
    
    
    typedef enum : NSUInteger {
        
        HTTPRequestType = 0x11,      // 二进制格式 (不设置的话为默认格式)
        JSONRequestType,             // JSON方式
        PlistRequestType,            // 集合文件方式
        
    } AFNetworkingRequestType;
    
    
    typedef enum : NSUInteger {
        
        HTTPResponseType = 0x22,     // 二进制格式 (不设置的话为默认格式)
        JSONResponseType,            // JSON方式
        PlistResponseType,           // 集合文件方式
        ImageResponseType,           // 图片方式
        CompoundResponseType,        // 组合方式
        
    } AFNetworkingResponseType;
    
    
    @protocol NetworkingDelegate <NSObject>
    @optional
    /**
     *  请求成功
     *
     *  @param networking Networking实例对象
     *  @param data       数据
     */
    - (void)requestSucess:(Networking *)networking data:(id)data;
    
    /**
     *  请求失败
     *
     *  @param networking Networking实例对象
     *  @param error      错误信息
     */
    - (void)requestFailed:(Networking *)networking error:(NSError *)error;
    
    /**
     *  用户取消请求
     *
     *  @param networking Networking实例对象
     *  @param error      错误信息
     */
    - (void)userCanceledFailed:(Networking *)networking error:(NSError *)error;
    
    @end
    
    @interface Networking : NSObject
    
    /**
     *  代理
     */
    @property (nonatomic, weak)  id <NetworkingDelegate>  delegate;
    
    /**
     *  标识符
     */
    @property (nonatomic, strong) NSString               *flag;
    
    /**
     *  超时时间间隔(设置了才能生效,不设置,使用的是AFNetworking自身的超时时间间隔)
     */
    @property (nonatomic, strong) NSNumber               *timeoutInterval;
    
    /**
     *  请求的类型
     */
    @property (nonatomic) AFNetworkingRequestType         requestType;
    
    /**
     *  回复的类型
     */
    @property (nonatomic) AFNetworkingResponseType        responseType;
    
    /**
     *  请求的方法类型
     */
    @property (nonatomic) AFNetworkingRequestMethod       RequestMethod;
    
    /**
     *  网络请求地址
     */
    @property (nonatomic, strong) NSString               *urlString;
    
    /**
     *  作为请求用字典
     */
    @property (nonatomic, strong) NSDictionary           *requestDictionary;
    
    /**
     *
     *  -====== 此方法由继承的子类来重载实现 ======-
     *
     *  转换请求字典
     *
     *  @return 转换后的字典
     */
    - (NSDictionary *)transformRequestDictionary;
    
    /**
     *
     *  -====== 此方法由继承的子类来重载实现 ======-
     *
     *  对返回的结果进行转换
     *
     *  @return 转换后的结果
     */
    - (id)transformRequestData:(id)data;
    
    /**
     *  开始请求
     */
    - (void)startRequest;
    
    /**
     *  取消请求
     */
    - (void)cancelRequest;
    
    #pragma mark - 便利构造器方法
    
    /**
     *  便利构造器方法
     *
     *  @param urlString         请求地址
     *  @param requestDictionary 请求参数
     *  @param delegate          代理
     *  @param timeoutInterval   超时时间
     *  @param flag              标签
     *  @param requestMethod     请求方法
     *  @param requestType       请求类型
     *  @param responseType      回复数据类型
     *
     *  @return 实例对象
     */
    + (instancetype)networkingWithUrlString:(NSString *)urlString
                          requestDictionary:(NSDictionary *)requestDictionary
                                   delegate:(id)delegate
                            timeoutInterval:(NSNumber *)timeoutInterval
                                       flag:(NSString *)flag
                              requestMethod:(AFNetworkingRequestMethod)requestMethod
                                requestType:(AFNetworkingRequestType)requestType
                               responseType:(AFNetworkingResponseType)responseType;
    
    @end
    //
    //  Networking.m
    //  NetworkingCraft
    //
    //  Created by YouXianMing on 15/6/11.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "Networking.h"
    #import "AFNetworking.h"
    
    typedef enum : NSUInteger {
        
        DEALLOC_CANCEL,  // dealloc取消
        USER_CANCEL,     // 用户取消
        
    } ECancelType;
    
    @interface Networking ()
    
    #pragma mark - Private Instance
    @property (nonatomic, strong) AFHTTPRequestOperationManager *manager;
    @property (nonatomic, strong) AFHTTPRequestOperation        *httpOperation;
    @property (nonatomic)         ECancelType                    cancelType;
    
    #pragma mark - Private Method
    
    /**
     *  默认设置
     */
    - (void)defaultConfig;
    
    /**
     *  根据序列化枚举值返回对应的请求策略
     *
     *  @param serializerType 序列化枚举值
     *
     *  @return 序列化策略
     */
    + (AFHTTPRequestSerializer *)requestSerializerWith:(AFNetworkingRequestType)serializerType;
    
    /**
     *  根据序列化枚举值返回对应的回复策略
     *
     *  @param serializerType 序列化枚举值
     *
     *  @return 序列化策略
     */
    + (AFHTTPResponseSerializer *)responseSerializerWith:(AFNetworkingResponseType)serializerType;
    
    @end
    
    @implementation Networking
    
    /**
     *  初始化方法
     *
     *  @return 实例对象
     */
    - (instancetype)init {
        self = [super init];
        if (self) {
            
            // 默认设置
            [self defaultConfig];
        }
        return self;
    }
    
    - (void)defaultConfig {
        
        self.manager = [AFHTTPRequestOperationManager manager];
        
        // 设置回复内容信息
        self.manager.responseSerializer.acceptableContentTypes = 
            [self.manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
    
    }
    
    
    - (void)startRequest {
        
        if (self.urlString.length <= 0) {
            return;
        }
        
        // 设置请求类型
        if (self.requestType) {
            self.manager.requestSerializer  = [Networking requestSerializerWith:self.requestType];
        } else {
            self.manager.requestSerializer  = [Networking requestSerializerWith:HTTPRequestType];
        }
        
        // 设置回复类型
        if (self.responseType) {
            self.manager.responseSerializer = [Networking responseSerializerWith:self.responseType];
        } else {
            self.manager.responseSerializer = [Networking responseSerializerWith:HTTPResponseType];
        }
        
        // 设置超时时间
        if (self.timeoutInterval && self.timeoutInterval.floatValue > 0) {
            [self.manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
            self.manager.requestSerializer.timeoutInterval = self.timeoutInterval.floatValue;
            [self.manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
        }
    
        // 开始执行请求
        if (self.RequestMethod == GET_METHOD) {
            
            __weak Networking *weakSelf = self;
            self.httpOperation = [self.manager GET:self.urlString
                                        parameters:[weakSelf transformRequestDictionary]
                                           success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                               
                                               if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestSucess:data:)]) {
                                                   [weakSelf.delegate requestSucess:weakSelf data:[weakSelf transformRequestData:responseObject]];
                                               }
                                               
                                           }
                                           failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                               
                                               if (self.cancelType == USER_CANCEL) {
                                                   if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(userCanceledFailed:error:)]) {
                                                       [weakSelf.delegate userCanceledFailed:weakSelf error:error];
                                                       weakSelf.cancelType = DEALLOC_CANCEL;
                                                   }
                                               } else {
                                                   if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestFailed:error:)]) {
                                                       [weakSelf.delegate requestFailed:weakSelf error:error];
                                                   }
                                               }
                                               
                                           }];
            
        } else if (self.RequestMethod == POST_METHOD) {
        
            __weak Networking *weakSelf = self;
            self.httpOperation = [self.manager POST:self.urlString
                                         parameters:[weakSelf transformRequestDictionary]
                                            success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                                
                                                if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestSucess:data:)]) {
                                                    [weakSelf.delegate requestSucess:weakSelf data:[weakSelf transformRequestData:responseObject]];
                                                }
                                                
                                            }
                                            failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                                
                                                if (self.cancelType == USER_CANCEL) {
                                                    if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(userCanceledFailed:error:)]) {
                                                        [weakSelf.delegate userCanceledFailed:weakSelf error:error];
                                                        weakSelf.cancelType = DEALLOC_CANCEL;
                                                    }
                                                } else {
                                                    if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestFailed:error:)]) {
                                                        [weakSelf.delegate requestFailed:weakSelf error:error];
                                                    }
                                                }
                                                
                                            }];
            
        } else {
        
        }
    }
    
    - (void)cancelRequest {
        self.cancelType = USER_CANCEL;
        [self.httpOperation cancel];
    }
    
    - (void)dealloc {
        self.cancelType = DEALLOC_CANCEL;
        [self.httpOperation cancel];
    }
    
    + (AFHTTPRequestSerializer *)requestSerializerWith:(AFNetworkingRequestType)serializerType {
        if (serializerType == JSONRequestType) {
            return [AFJSONRequestSerializer serializer];
        } else if (serializerType == HTTPRequestType) {
            return [AFHTTPRequestSerializer serializer];
        } else if (serializerType == PlistRequestType) {
            return [AFPropertyListRequestSerializer serializer];
        } else {
            return nil;
        }
    }
    
    + (AFHTTPResponseSerializer *)responseSerializerWith:(AFNetworkingResponseType)serializerType {
        if (serializerType == JSONResponseType) {
            return [AFJSONResponseSerializer serializer];
        } else if (serializerType == HTTPResponseType) {
            return [AFHTTPResponseSerializer serializer];
        } else if (serializerType == PlistResponseType) {
            return [AFPropertyListResponseSerializer serializer];
        } else if (serializerType == ImageResponseType) {
            return [AFImageResponseSerializer serializer];
        } else if (serializerType == CompoundResponseType) {
            return [AFCompoundResponseSerializer serializer];
        } else {
            return nil;
        }
    }
    
    - (NSDictionary *)transformRequestDictionary {
        return self.requestDictionary;
    }
    
    - (id)transformRequestData:(id)data {
        return data;
    }
    
    + (instancetype)networkingWithUrlString:(NSString *)urlString
                          requestDictionary:(NSDictionary *)requestDictionary
                                   delegate:(id)delegate
                            timeoutInterval:(NSNumber *)timeoutInterval
                                       flag:(NSString *)flag
                              requestMethod:(AFNetworkingRequestMethod)requestMethod
                                requestType:(AFNetworkingRequestType)requestType
                               responseType:(AFNetworkingResponseType)responseType {
        
        Networking *networking       = [[[self class] alloc] init];
        networking.urlString         = urlString;
        networking.requestDictionary = requestDictionary;
        networking.delegate          = delegate;
        networking.timeoutInterval   = timeoutInterval;
        networking.flag              = flag;
        networking.RequestMethod     = requestMethod;
        networking.requestType       = requestType;
        networking.responseType      = responseType;
        
        return networking;
    }
    
    @end

    下载请求源码

    //
    //  DownloadTask.h
    //  NetworkingCraft
    //
    //  Created by YouXianMing on 15/6/11.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    @class DownloadTask;
    
    @protocol DownloadTaskDelegate <NSObject>
    @optional
    /**
     *  下载任务
     *
     *  @param downloadTask 实例对象
     *  @param progress     进度显示
     */
    - (void)downloadTask:(DownloadTask *)downloadTask withProgress:(CGFloat)progress;
    
    /**
     *  下载失败
     *
     *  @param downloadTask 实例对象
     *  @param error        错误信息
     */
    - (void)downloadTask:(DownloadTask *)downloadTask failedWithError:(NSError *)error;
    
    /**
     *  下载成功
     *
     *  @param downloadTask 实例对象
     */
    - (void)downloadTaskSucess:(DownloadTask *)downloadTask;
    
    @end
    
    @interface DownloadTask : NSObject
    
    /**
     *  代理
     */
    @property (nonatomic, weak) id <DownloadTaskDelegate>    delegate;
    
    /**
     *  下载地址
     */
    @property (nonatomic, strong) NSString                  *urlString;
    
    /**
     *  存储的文件路径(不包括文件名字,如果不设置,则默认在/Library/Caches文件夹下)
     *
     *  --------------------
     *  /Documents
     *  /Library/Caches
     *  /Library/Preferences
     *  /tmp
     *  --------------------
     *
     */
    @property (nonatomic, strong) NSString                  *filePath;
    
    /**
     *  文件名(如果不给文件名,则使用默认的文件名)
     */
    @property (nonatomic, strong) NSString                  *fileName;
    
    /**
     *  绝对文件路径
     */
    @property (nonatomic, strong, readonly) NSString        *file;
    
    /**
     *  开始下载
     */
    - (void)startDownload;
    
    /**
     *  停止下载
     */
    - (void)stopDownload;
    
    #pragma mark - 便利构造器
    /**
     *  便利构造器
     *
     *  @param urlString 下载地址
     *  @param filePath  文件相对目录(可以不设置)
     *  @param fileName  文件名字(可以不设置)
     *  @param delegate  代理对象
     *
     *  @return 实例对象
     */
    + (instancetype)downloadTaskWithUrlString:(NSString *)urlString
                                fileDirectory:(NSString *)filePath
                                     fileName:(NSString *)fileName
                                     delegate:(id)delegate;
    
    @end
    //
    //  DownloadTask.m
    //  NetworkingCraft
    //
    //  Created by YouXianMing on 15/6/11.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "DownloadTask.h"
    #import "AFNetworking.h"
    
    @interface DownloadTask ()
    
    @property (nonatomic, strong) AFHTTPSessionManager      *session;
    @property (nonatomic, strong) NSURLSessionDownloadTask  *downloadTask;
    @property (nonatomic, strong) NSString                  *file;
    
    @end
    
    @implementation DownloadTask
    
    - (instancetype)init {
        self = [super init];
        if (self) {
        
            [self defaultConfig];
        }
        
        return self;
    }
    
    - (void)defaultConfig {
        self.session = [AFHTTPSessionManager manager];
    }
    
    - (void)startDownload {
        
        if (self.urlString.length <= 0) {
            return;
        }
        
        // 定义一个progress指针
        NSProgress *progress;
        
        // 创建一个URL链接
        NSURL *url = [NSURL URLWithString:self.urlString];
        
        // 初始化一个请求
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        // 开始下载任务
        __weak DownloadTask *weakSelf = self;
        self.downloadTask = 
            [self.session downloadTaskWithRequest:request
                                         progress:&progress
                                      destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
                                          
                                          // 获取基本路径
                                          NSString *filePath = nil;
                                          
                                          // 文件路径
                                          if (weakSelf.filePath) {
                                              filePath = [weakSelf pathWithSting:self.filePath];
                                          } else {
                                              filePath = [weakSelf pathWithSting:@"/Library/Caches"];
                                          }
                                          
                                          // 文件名字
                                          if (weakSelf.fileName) {
                                              filePath = [filePath stringByAppendingPathComponent:weakSelf.fileName];
                                          } else {
                                              filePath = [filePath stringByAppendingPathComponent:[response suggestedFilename]];
                                          }
                                          
                                          // 获取文件绝对路径
                                          weakSelf.file = filePath;
                                          
                                          NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:filePath];
                                          
                                          return documentsDirectoryURL;
                                          
                                      } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
                                          
                                          if (weakSelf.delegate) {
                                              // 结束后移除掉这个progress
                                              [progress removeObserver:self
                                                            forKeyPath:@"fractionCompleted"
                                                               context:nil];
                                              
                                              if (error == nil) {
                                                  // 成功
                                                  if ([weakSelf.delegate respondsToSelector:@selector(downloadTaskSucess:)]) {
                                                      [weakSelf.delegate downloadTaskSucess:weakSelf];
                                                  }
                                              } else {
                                                  // 出错
                                                  if ([weakSelf.delegate respondsToSelector:@selector(downloadTask:failedWithError:)]) {
                                                      [weakSelf.delegate downloadTask:weakSelf failedWithError:error];
                                                  }
                                              }
                                              
                                          }
                                      }];
        
        // 开始下载
        [self.downloadTask resume];
        
        if (self.delegate) {
            // 给这个progress添加监听任务
            [progress addObserver:self
                       forKeyPath:@"fractionCompleted"
                          options:NSKeyValueObservingOptionNew
                          context:nil];
        }
    }
    
    - (void)stopDownload {
        [self.downloadTask cancel];
    }
    
    /**
     *  获取路径
     *
     *  @param string 相对路径
     *
     *  @return 绝对路径
     */
    - (NSString *)pathWithSting:(NSString *)string {
        return [NSHomeDirectory() stringByAppendingPathComponent:string];
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath
                          ofObject:(id)object
                            change:(NSDictionary *)change
                           context:(void *)context {
        if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) {
            NSProgress *progress = (NSProgress *)object;
            [_delegate downloadTask:self withProgress:progress.fractionCompleted];
        }
    }
    
    + (instancetype)downloadTaskWithUrlString:(NSString *)urlString
                                fileDirectory:(NSString *)filePath
                                     fileName:(NSString *)fileName
                                     delegate:(id)delegate {
        
        DownloadTask *downloadTask = [[[self class] alloc] init];
        downloadTask.urlString     = urlString;
        downloadTask.filePath      = filePath;
        downloadTask.fileName      = fileName;
        downloadTask.delegate      = delegate;
        
        return downloadTask;
    }
    
    @end

    使用

  • 相关阅读:
    老调重弹--面向对象设计原则--S.O.L.I.D设计原则
    老调重弹--面向对象设计原则--GRASP设计原则
    【C#版本详情回顾】C#4.0主要功能列表
    【C#版本详情回顾】C#3.0主要功能列表
    【C#版本详情回顾】C#2.0主要功能列表
    .NET Framework和C#版本历史概览
    springmvc RESTful
    springmvc之json交互
    springmvc上传图片
    springmvc异常处理
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4570410.html
Copyright © 2011-2022 走看看