【iOS 開發(fā)】AFNetworking 3.0 使用匯總(包括文件上傳和文件下載)

AFNetworking

由于自己公司的項目使用的還是老的 AFNetworking 2.0 父丰,其中的網(wǎng)絡請求使用的是 AFHTTPRequestOperationManager 罐寨,這個類在 AFNetworking 3.0 中已被廢棄泛豪,所以需要將公司項目中的網(wǎng)絡請求全部升級為 AFNetworking 3.0 迷守,現(xiàn)在分享一下使用匯總板丽。


參數(shù)設(shè)置

AFNetworking 3.0 使用的是 AFHTTPSessionManager 來進行網(wǎng)絡請求的涡相,下面介紹一下參數(shù)的設(shè)置适袜。

  • 關(guān)于 requestSerializer 它是 AFNetworking 參數(shù)編碼的序列化器柄错,它一共有三種編碼格式,responseSerializer 同理苦酱,選擇哪種看自己的需求售貌。
1. AFHTTPRequestSerializer:是普通的 HTTP 的編碼格式的,也就是 mid=10&method=userInfo&dateInt=20160818 這種格式的疫萤。
  
2. AFJSONRequestSerializer:是 JSON 編碼格式的趁矾,也就是 {"mid":"11","method":"userInfo","dateInt":"20160818"} 這種格式的。
  
3. AFPropertyListRequestSerializer:這個沒用過给僵,但是看介紹說是編碼成 plist 格式的參數(shù)毫捣。
  • HTTPHeaderField 請求頭沒有的話可以不用設(shè)置。
/* 創(chuàng)建網(wǎng)絡請求對象 */
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  
/* 設(shè)置請求和接收的數(shù)據(jù)編碼格式 */
manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 設(shè)置請求數(shù)據(jù)為 JSON 數(shù)據(jù)
manager.responseSerializer = [AFJSONResponseSerializer serializer]; // 設(shè)置接收數(shù)據(jù)為 JSON 數(shù)據(jù)
  
/* 設(shè)置請求頭 */
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:@"xxx" forHTTPHeaderField:@"xxx"];
[manager.requestSerializer setValue:@"xxx" forHTTPHeaderField:@"xxx"];
  
/* 請求地址 */
NSString *url = @"http://xxx";
  
/* 請求參數(shù) */
NSDictionary *parameters = @{@"xxx" : @"xxx",
                             @"xxx" : @"xxx",
                             @"xxx" : @"xxx"};

網(wǎng)絡請求

網(wǎng)絡請求有 GET 請求帝际、POST 請求蔓同、文件上傳 這幾種,按自己需求選擇相應請求的方法蹲诀,參數(shù)設(shè)置使用上面的設(shè)置斑粱,文件下載 的話有點不一樣,下面會單獨說脯爪。

1. GET 請求

[manager GET:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    NSLog(@"請求成功:%@", responseObject);
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    NSLog(@"請求失斣虮薄:%@", error);
}];

2. POST 請求

[manager POST:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    NSLog(@"請求成功:%@", responseObject);
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    NSLog(@"請求失斂笪ⅰ:%@", error);
}];

3. 文件上傳

下面以圖片上傳為例,其他文件的上傳都是差不多的尚揣。

[manager POST:url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    
    /* 本地圖片上傳 */
    NSURL *imageUrl = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"png"];
    NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
    
    // 直接將圖片對象轉(zhuǎn)成 data 也可以
    // UIImage *image = [UIImage imageNamed:@"test"];
    // NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
    
    /* 上傳數(shù)據(jù)拼接 */
    [formData appendPartWithFileData:imageData name:@"file" fileName:@"test.png" mimeType:@"image/png"];
    
} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    NSLog(@"上傳成功:%@", responseObject);
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    NSLog(@"上傳失斢渴浮:%@", error);
}];

請求結(jié)果的處理

  • 以下方法能夠?qū)@取到的 responseObject 數(shù)據(jù)直接轉(zhuǎn)成 NSString 字符串或者 NSDictionary 字典,也可以使用 MJExtension 這個第三方庫快骗,能夠?qū)@取到的 responseObject 直接轉(zhuǎn)換成對象娜庇,如果要轉(zhuǎn)成字典或是對象, responseObject 必須是 JSON 格式的方篮。
[manager POST:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    /* 將得到的數(shù)據(jù)轉(zhuǎn)換成 NSString 字符串 */
    NSString *infoStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"請求到的數(shù)據(jù):%@", infoStr);
    
    /* 將得到的 JSON 數(shù)據(jù)轉(zhuǎn)換成 NSDictionary 字典 */
    NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
    NSLog(@"請求到的數(shù)據(jù):%@", resultDic);
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    NSLog(@"請求失斆恪:%@", error);
}];
  • AFNetworking 2.0 的返回參數(shù)是 AFHTTPRequestOperation ,而 AFNetworking 3.0 的返回參數(shù)是 NSURLSessionDataTask 藕溅,所以還是有些區(qū)別的匕得,如果需要得到 allHeaderFields 這個參數(shù)需要強轉(zhuǎn)一下。
[manager POST:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    /* allHeaderFields 參數(shù)獲取 */
    NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
    NSDictionary *headerFields = response.allHeaderFields;
    NSLog(@"請求頭:%@", headerFields);
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    NSLog(@"請求失斀肀怼:%@", error);
}];

文件下載

文件下載的話和上面三個不太一樣耗跛,所以單獨來說,上面那些設(shè)置的參數(shù)都不需要了攒发,具體代碼看下面调塌。

/* 創(chuàng)建網(wǎng)絡下載對象 */
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
  
/* 下載地址 */
NSURL *url = [NSURL URLWithString:@"http://xxx/test.mp4"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
  
/* 下載路徑 */
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *filePath = [path stringByAppendingPathComponent:url.lastPathComponent];
  
/* 開始請求下載 */
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
    
    NSLog(@"下載進度:%.0f%", downloadProgress.fractionCompleted * 100);
    
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
    
    /* 設(shè)定下載到的位置 */
    return [NSURL fileURLWithPath:filePath];
    
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
    
    NSLog(@"下載完成");
    
}];
[downloadTask resume];

監(jiān)聽網(wǎng)絡狀態(tài)

AFNetWorking 也可以用來監(jiān)聽網(wǎng)絡狀態(tài),當網(wǎng)絡狀態(tài)發(fā)生改變的時候會自動調(diào)用以下 Block 回調(diào)惠猿,具體方法如下羔砾。

/* 監(jiān)聽網(wǎng)絡狀態(tài) */
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    if (status == AFNetworkReachabilityStatusUnknown) {
        NSLog(@"當前網(wǎng)絡:未知網(wǎng)絡");
    } else if (status == AFNetworkReachabilityStatusNotReachable) {
        NSLog(@"當前網(wǎng)絡:沒有網(wǎng)絡");
    } else if (status == AFNetworkReachabilityStatusReachableViaWWAN) {
        NSLog(@"當前網(wǎng)絡:手機流量");
    } else if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
        NSLog(@"當前網(wǎng)絡:WiFi");
    }
}];
[manager startMonitoring];

AFNetworking 3.0 的大致使用方法都在這了,有需要的可以收藏一下偶妖。

將來的你姜凄,一定會感激現(xiàn)在拼命的自己,愿自己與讀者的開發(fā)之路無限美好趾访。

我的傳送門: 博客 态秧、簡書微博 扼鞋、GitHub 申鱼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市云头,隨后出現(xiàn)的幾起案子捐友,更是在濱河造成了極大的恐慌,老刑警劉巖溃槐,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣砖,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機猴鲫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門对人,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拂共,你說我怎么就攤上這事牺弄。” “怎么了匣缘?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵猖闪,是天一觀的道長鲜棠。 經(jīng)常有香客問我肌厨,道長,這世上最難降的妖魔是什么豁陆? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任柑爸,我火速辦了婚禮,結(jié)果婚禮上盒音,老公的妹妹穿的比我還像新娘表鳍。我一直安慰自己,他們只是感情好祥诽,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布譬圣。 她就那樣靜靜地躺著,像睡著了一般雄坪。 火紅的嫁衣襯著肌膚如雪厘熟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天维哈,我揣著相機與錄音绳姨,去河邊找鬼。 笑死阔挠,一個胖子當著我的面吹牛飘庄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播购撼,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跪削,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迂求?” 一聲冷哼從身側(cè)響起切揭,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锁摔,沒想到半個月后廓旬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年孕豹,在試婚紗的時候發(fā)現(xiàn)自己被綠了涩盾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡励背,死狀恐怖春霍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叶眉,我是刑警寧澤址儒,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站衅疙,受9級特大地震影響莲趣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饱溢,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一喧伞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绩郎,春花似錦潘鲫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至状植,卻和暖如春浊竟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浅萧。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洼畅,地道東北人吩案。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像帝簇,于是被迫代替她去往敵國和親徘郭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理丧肴,服務發(fā)現(xiàn)残揉,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • AFNetWorking的介紹 分享一個很詳細的總結(jié) www.cocoachina.com/ios/2016120...
    Phaemlo閱讀 732評論 0 0
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,985評論 6 13
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,387評論 0 6
  • 女司機是馬路殺手芋浮?大數(shù)據(jù)笑而不語 不知從何時起 女司機成為了“馬路殺手”的代名詞 當路上出現(xiàn)一枚女司機時 方圓十里...
    藍鯨藍鯨閱讀 188評論 0 0