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ā)之路無限美好趾访。