AFNetworking 的二次封裝(GET槐秧、POST、文件上傳忧设、文件下載刁标、超時(shí)、HTTPS址晕、請求頭膀懈、取消網(wǎng)絡(luò)請求)

  • .h文件
//
//  SHRequestBase.h
//  SHNetworkRequest
//
//  Created by CSH on 2019/5/31.
//  Copyright ? 2019 CSH. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 網(wǎng)絡(luò)請求基礎(chǔ)
 */
@interface SHRequestBase : NSObject

// 必填
//地址
@property (nonatomic, copy) NSString *url;

// 選填
//進(jìn)度
@property (nonatomic, copy) void(^progress)(NSProgress *progress);
//成功
@property (nonatomic, copy) void (^success)(id responseObj);
//失敗
@property (nonatomic, copy) void (^failure)(NSError *error);

//公共參數(shù)
//參數(shù)
@property (nonatomic, copy) id param;
//請求頭
@property (nonatomic, copy) NSDictionary <NSString *, NSString *> *headers;
//請求標(biāo)記
@property (nonatomic, copy) NSString *tag;
//重試次數(shù)
@property (nonatomic, assign) NSInteger retry;

#pragma mark GET
- (void)requestGet;

#pragma mark POST
- (void)requestPost;

#pragma mark FORM
- (void)requestFormWithFormParam:(id)formParam;

#pragma mark 文件上傳(單個(gè))
- (void)requestUploadFileWithName:(NSString *_Nullable)name
                     data:(NSData *)data;

#pragma mark 文件上傳(多個(gè) 一次)
- (void)requestUploadFilesWithName:(NSString *_Nullable)name
                     datas:(NSArray< NSData * > *)datas;

#pragma mark 文件上傳(多個(gè) 多次)
- (void)requestUploadFilesManyWithName:(NSString *_Nullable)name
                         datas:(NSArray< NSData * > *)datas;

#pragma mark 文件下載
- (void)requestDownLoadFlieWithFlie:(NSString *)file;

#pragma mark 獲取請求隊(duì)列
- (NSDictionary *)getRequestQueue;

#pragma mark 取消所有網(wǎng)絡(luò)請求
- (void)cancelAllOperations;

#pragma mark 取消某個(gè)網(wǎng)絡(luò)請求
- (void)cancelOperationsWithTag:(NSString *)tag;

@end

NS_ASSUME_NONNULL_END

  • .m文件


//
//  SHRequestBase.m
//  SHNetworkRequest
//
//  Created by CSH on 2019/5/31.
//  Copyright ? 2019 CSH. All rights reserved.
//

#import "SHRequestBase.h"
#import "AFHTTPSessionManager.h"

@implementation SHRequestBase

//請求隊(duì)列
static NSMutableDictionary *netQueueDic;
//默認(rèn)超時(shí)
static NSInteger timeOut = 10;
//日志
static bool isLog = YES;

#pragma mark - 實(shí)例化請求對(duì)象
+ (AFHTTPSessionManager *)manager
{
    static AFHTTPSessionManager *mgr;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        mgr = [AFHTTPSessionManager manager];
        mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
                                                         @"text/json",
                                                         @"text/javascript",
                                                         @"text/html",
                                                         @"text/plain",
                                                         @"multipart/form-data",
                                                         nil];
        mgr.securityPolicy.allowInvalidCertificates = YES;
        mgr.securityPolicy.validatesDomainName = NO;
        mgr.requestSerializer.timeoutInterval = timeOut;
        
        mgr.requestSerializer = [AFHTTPRequestSerializer serializer];
        mgr.responseSerializer = [AFJSONResponseSerializer serializer];
        
        [mgr.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        
        //網(wǎng)絡(luò)監(jiān)聽
        [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status)
            {
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    //只加載網(wǎng)絡(luò)
                    mgr.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringCacheData;
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    //只加載網(wǎng)絡(luò)
                    mgr.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringCacheData;
                    break;
                default:
                    //只加載本地
                    mgr.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataDontLoad;
                    break;
            }
        }];
        
        //開始監(jiān)聽
        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        
        //請求隊(duì)列
        netQueueDic = [[NSMutableDictionary alloc] init];
    });
    
    return mgr;
}

#pragma mark - 請求方法

#pragma mark GET
- (void)requestGet{
    
    // 獲取對(duì)象
    AFHTTPSessionManager *mgr = [SHRequestBase manager];
    
    // 開始請求
    NSURLSessionDataTask *task = [mgr GET:self.url
                               parameters:self.param
                                  headers:self.headers
                                 progress:self.progress
                                  success:^(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject) {
        //處理
        [self handleSuccess:responseObject];
        
    }
                                  failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nullable error) {
        if (self.retry > 0)
        {
            //重新請求
            self.retry--;
            [self requestGet];
        }
        else
        {
            [self handleFailure:error];
        }
    }];
    
    [self handleTag:task];
}

#pragma mark POST
- (void)requestPost{
    // 獲取對(duì)象
    AFHTTPSessionManager *mgr = [SHRequestBase manager];
    
    // 開始請求
    NSURLSessionDataTask *task = [mgr POST:self.url
                                parameters:self.param
                                   headers:self.headers
                                  progress:self.progress
                                   success:^(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject) {
        //處理
        [self handleSuccess:responseObject];
        
    }
                                   failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nullable error) {
        if (self.retry > 0)
        {
            //重新請求
            self.retry--;
            [self requestGet];
        }
        else
        {
            [self handleFailure:error];
        }
    }];
    
    [self handleTag:task];
}

#pragma mark FORM
- (void)requestFormWithFormParam:(id)formParam{
    // 獲取對(duì)象
    AFHTTPSessionManager *mgr = [SHRequestBase manager];
    
    // 開始請求
    NSURLSessionDataTask *task = [mgr POST:self.url
                                parameters:self.param
                                   headers:self.headers
                 constructingBodyWithBlock:^(id< AFMultipartFormData > _Nullable formData) {
        NSError *error = nil;
        NSData *data = [NSJSONSerialization dataWithJSONObject:formParam options:NSJSONWritingPrettyPrinted error:&error];
        
        if (!error)
        {
            [formData appendPartWithFormData:data name:@"items"];
        }
        else
        {
            [self handleFailure:error];
        }
    }
                                  progress:self.progress
                                   success:^(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject) {
        [self handleSuccess:responseObject];
    }
                                   failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nullable error) {
        
        if (self.retry > 0)
        {
            //重新請求
            self.retry--;
            [self requestFormWithFormParam:formParam];
            
        }
        else
        {
            [self handleFailure:error];
        }
    }];
    [self handleTag:task];
}

#pragma mark 文件上傳(單個(gè))
- (void)requestUploadFileWithName:(NSString *_Nullable)name
                             data:(NSData *)data{
    name = name ?: @"file.jpg";
    // 獲取對(duì)象
    AFHTTPSessionManager *mgr = [SHRequestBase manager];
    
    // 開始請求
    NSURLSessionDataTask *task = [mgr POST:self.url
                                parameters:self.param
                                   headers:self.headers
                 constructingBodyWithBlock:^(id< AFMultipartFormData > _Nullable formData) {
        if (data)
        {
            NSArray *temp = [name componentsSeparatedByString:@"."];
            if (temp.count != 2)
            {
                temp = @[ name, @"jpg" ];
            }
            [formData appendPartWithFileData:data name:temp[0] fileName:[NSString stringWithFormat:@"file.%@", temp[1]] mimeType:@"application/octet-stream"];
        }
    }
                                  progress:self.progress
                                   success:^(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject) {
        [self handleSuccess:responseObject];
    }
                                   failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nullable error) {
        
        if (self.retry > 0)
        {
            //重新請求
            self.retry--;
            [self requestUploadFileWithName:name data:data];
            
        }
        else
        {
            [self handleFailure:error];
        }
    }];
    [self handleTag:task];
}

#pragma mark 文件上傳(多個(gè) 一次)
- (void)requestUploadFilesWithName:(NSString *_Nullable)name
                             datas:(NSArray< NSData * > *)datas{
    name = name ?: @"file.jpg";
    // 獲取對(duì)象
    AFHTTPSessionManager *mgr = [SHRequestBase manager];
    
    // 開始請求
    NSURLSessionDataTask *task = [mgr POST:self.url
                                parameters:self.param
                                   headers:self.headers
                 constructingBodyWithBlock:^(id< AFMultipartFormData > _Nullable formData) {
        [datas enumerateObjectsUsingBlock:^(NSData *_Nonnull obj, NSUInteger idx, BOOL *_Nonnull stop) {
            NSArray *temp = [name componentsSeparatedByString:@"."];
            if (temp.count != 2)
            {
                temp = @[ name, @"jpg" ];
            }
            [formData appendPartWithFileData:obj name:temp[0] fileName:[NSString stringWithFormat:@"file.%@", temp[1]] mimeType:@"application/octet-stream"];
        }];
    }
                                  progress:self.progress
                                   success:^(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject) {
        [self handleSuccess:responseObject];
    }
                                   failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nullable error) {
        
        if (self.retry > 0)
        {
            //重新請求
            self.retry--;
            [self requestUploadFilesWithName:name datas:datas];
            
        }
        else
        {
            [self handleFailure:error];
        }
    }];
    [self handleTag:task];
}

#pragma mark 文件上傳(多個(gè) 多次)
- (void)requestUploadFilesManyWithName:(NSString *_Nullable)name
                                 datas:(NSArray< NSData * > *)datas{
    name = name ?: @"file.jpg";
    
    // 獲取對(duì)象
    AFHTTPSessionManager *mgr = [SHRequestBase manager];
    __block NSMutableDictionary *temp = [[NSMutableDictionary alloc] init];
    
    dispatch_group_t group = dispatch_group_create();
    
    //循環(huán)
    [datas enumerateObjectsUsingBlock:^(NSData *_Nonnull obj, NSUInteger idx, BOOL *_Nonnull stop) {
        dispatch_group_enter(group);
        // 開始請求
        [mgr POST:self.url
       parameters:self.param
          headers:self.headers
constructingBodyWithBlock:^(id< AFMultipartFormData > _Nullable formData) {
            NSArray *temp = [name componentsSeparatedByString:@"."];
            if (temp.count != 2)
            {
                temp = @[ name, @"jpg" ];
            }
            [formData appendPartWithFileData:obj name:temp[0] fileName:[NSString stringWithFormat:@"file.%@", temp[1]] mimeType:@"application/octet-stream"];
        }
         progress:self.progress
          success:^(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject) {
            dispatch_group_leave(group);
            //存起來
            [temp setValue:responseObject forKey:[NSString stringWithFormat:@"%lu", (unsigned long)idx]];
        }
          failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nullable error) {
            *stop = YES;
            dispatch_group_leave(group);
            [self handleFailure:error];
        }];
    }];
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
      
        [self handleSuccess:temp];
    });
}

#pragma mark 文件下載
- (void)requestDownLoadFlieWithFlie:(NSString *)file{
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.url]];
    
    // 獲取對(duì)象
    AFHTTPSessionManager *mgr = [SHRequestBase manager];
    
    //開始請求
    NSURLSessionDownloadTask *task = [mgr downloadTaskWithRequest:request
                                                         progress:self.progress
                                                      destination:^NSURL *_Nullable(NSURL *_Nullable targetPath, NSURLResponse *_Nullable response) {
        return [NSURL fileURLWithPath:file];
    }
                                                completionHandler:^(NSURLResponse *_Nullable response, NSURL *_Nullable filePath, NSError *_Nullable error) {
        
        if (error)
        {
            if (self.retry > 0)
            {
                //重新請求
                self.retry--;
                [self requestDownLoadFlieWithFlie:file];
                
            }
            else
            {
                [self handleFailure:error];
            }
        }
        else
        {
            [self handleSuccess:filePath];
        }
    }];
    //啟動(dòng)
    [task resume];
    [self handleTag:task];
}

#pragma mark 獲取請求隊(duì)列
- (NSDictionary *)getRequestQueue{
    return netQueueDic;
}

#pragma mark 取消所有網(wǎng)絡(luò)請求
- (void)cancelAllOperations{
    NSDictionary *temp = [NSDictionary dictionaryWithDictionary:netQueueDic];
    
    [temp enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL *_Nonnull stop) {
        //取消網(wǎng)絡(luò)請求
        [self cancelOperationsWithTag:key];
    }];
}

#pragma mark 取消某個(gè)網(wǎng)絡(luò)請求
- (void)cancelOperationsWithTag:(NSString *)tag{
    if (tag)
    {
        //取消請求
        NSURLSessionTask *task = netQueueDic[tag];
        if (task)
        {
            [task cancel];
            //移除隊(duì)列
            [netQueueDic removeObjectForKey:tag];
        }
    }
}

#pragma mark - 私有方法
#pragma mark 處理成功
- (void)handleSuccess:(id)responseObject{
    //移除隊(duì)列
    [self cancelOperationsWithTag:self.tag];
    //打印
    if (isLog) {
        SHLog(@"地址:%@\n入?yún)ⅲ?@\n回參:%@", self.url, self.param, responseObject);
    }
    //回調(diào)
    if (self.success) {
        self.success(responseObject);
    }
}

#pragma mark 處理失敗
- (void)handleFailure:(NSError *)error{
    //移除隊(duì)列
    [self cancelOperationsWithTag:self.tag];
    //打印
    if (isLog) {
        SHLog(@"地址:%@\n入?yún)ⅲ?@\n回參:%@", self.url, self.param, error.description);
    }
    //回調(diào)
    if (self.success) {
        self.failure(error);
    }
}

#pragma mark 處理tag
- (void)handleTag:(NSURLSessionTask *)task{
    if (self.tag.length)
    {
        //添加隊(duì)列
        netQueueDic[self.tag] = task;
    }
}

@end

使用

//請求
    SHRequestBase *request = [SHRequestBase new];
    request.url = url;
    request.param = param;
    weakify(self);
    request.success = ^(id  _Nonnull responseObj) {
        //處理數(shù)據(jù)
        SHRequestBaseModel *model = [SHRequestBaseModel mj_objectWithKeyValues:responseObj];
        [weak_self handleDataWithModel:model error:nil block:result];
    };
    request.failure = ^(NSError * _Nonnull error) {
        //處理數(shù)據(jù)
        [weak_self handleDataWithModel:nil error:error block:result];
    };
    [request requestGet];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谨垃,隨后出現(xiàn)的幾起案子启搂,更是在濱河造成了極大的恐慌,老刑警劉巖乘客,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狐血,死亡現(xiàn)場離奇詭異,居然都是意外死亡易核,警方通過查閱死者的電腦和手機(jī)匈织,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牡直,“玉大人缀匕,你說我怎么就攤上這事∨鲆荩” “怎么了乡小?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饵史。 經(jīng)常有香客問我满钟,道長胜榔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任湃番,我火速辦了婚禮夭织,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吠撮。我一直安慰自己尊惰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布泥兰。 她就那樣靜靜地躺著弄屡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞋诗。 梳的紋絲不亂的頭發(fā)上膀捷,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音削彬,去河邊找鬼担孔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吃警,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啄育,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼酌心,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挑豌?” 一聲冷哼從身側(cè)響起安券,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氓英,沒想到半個(gè)月后侯勉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铝阐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年址貌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徘键。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡练对,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吹害,到底是詐尸還是另有隱情螟凭,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布它呀,位于F島的核電站螺男,受9級(jí)特大地震影響棒厘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜下隧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一奢人、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汪拥,春花似錦达传、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脯燃,卻和暖如春搂妻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辕棚。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工欲主, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逝嚎。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓扁瓢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親补君。 傳聞我的和親對(duì)象是個(gè)殘疾皇子引几,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容