什么是AFN
全稱是AFNetworking,是對NSURLSession的一層封裝
運行效率沒有ASI高灾杰,但是使用比ASI簡單
在iOS開發(fā)中艳吠,使用比較廣泛
-
AFN的github地址
AFHTTPSessionManager
- AFHTTPSessionManager
- 是AFN中最重要的對象之一
- 封裝了HTTP請求的常見處理
- GET\POST請求
- 解析服務(wù)器的響應(yīng)數(shù)據(jù)
- 創(chuàng)建
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
AFNetworking發(fā)送GET請求
// 1. 創(chuàng)建 會話管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 2. 發(fā)送GET 請求
/*
第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
第三參數(shù): progress 進度回調(diào)
第四參數(shù): success 成功回調(diào)
task: 請求任務(wù)
responseObject: 響應(yīng)體信息(JSON ---> OC對象)
第五參數(shù): failure 失敗回調(diào)
task: 請求任務(wù)
error: 錯誤信息
響應(yīng)頭: task.response
*/
[manager GET:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敗---- %@",error);
}];
AFNetworking 發(fā)送POST請求
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 發(fā)送POST請求
/*
第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
第三參數(shù): progress 進度回調(diào)
第四參數(shù): success 成功回調(diào)
task: 請求任務(wù)
responseObject: 響應(yīng)體信息(JSON ---> OC對象)
第五參數(shù): failure 失敗回調(diào)
task: 請求任務(wù)
error: 錯誤信息
響應(yīng)頭: task.response
*/
[manager POST:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敗---- %@",error);
}];
- AFNetworking GET請求和POST請求的具體代碼如下:
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"點擊" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
// [self getAFNetworking];
[self postAFNetworking];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
-(void)getAFNetworking
{
// 1. 創(chuàng)建 會話管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 2. 發(fā)送GET 請求
/*
第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
第三參數(shù): progress 進度回調(diào)
第四參數(shù): success 成功回調(diào)
task: 請求任務(wù)
responseObject: 響應(yīng)體信息(JSON ---> OC對象)
第五參數(shù): failure 失敗回調(diào)
task: 請求任務(wù)
error: 錯誤信息
響應(yīng)頭: task.response
*/
[manager GET:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敗---- %@",error);
}];
}
-(void)postAFNetworking
{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 發(fā)送POST請求
/*
第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
第三參數(shù): progress 進度回調(diào)
第四參數(shù): success 成功回調(diào)
task: 請求任務(wù)
responseObject: 響應(yīng)體信息(JSON ---> OC對象)
第五參數(shù): failure 失敗回調(diào)
task: 請求任務(wù)
error: 錯誤信息
響應(yīng)頭: task.response
*/
[manager POST:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敗---- %@",error);
}];
}
@end
AFNetworking實現(xiàn)文件下載
不多說了栏渺,直接上代碼磕诊,操作簡單明了
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"點擊" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
[self getAFNetworking];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
-(void)getAFNetworking
{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_03.mp4"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
// 下載文件
/*
第一參數(shù): 請求對象
第二參數(shù): progress 進度回調(diào) downloadProgress
第三參數(shù): destination 回調(diào)(目標位置)
有返回值
targetPath: 臨時文件路徑
response: 響應(yīng)頭信息
第四參數(shù): completionHandler 下載完成之后的回調(diào)
response: 響應(yīng)頭信息
filePath: 最終的文件路徑
error: 錯誤信息
*/
NSURLSessionDownloadTask * downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
// 監(jiān)聽下載進度
// completedUnitCount 已經(jīng)下載的數(shù)據(jù)大小
// totalUnitCount 文件數(shù)據(jù)的總大小
NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSString * fullPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
fullPath = [fullPath stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"臨時路徑:%@",targetPath);
NSLog(@"緩存路徑:%@",fullPath);
return [NSURL fileURLWithPath:fullPath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
NSLog(@"%@",filePath);
}];
// 3. 執(zhí)行task
[downloadTask resume];
}
AFNetworking實現(xiàn)文件上傳
上傳也不多說融痛,以后在慢慢解釋各個參數(shù)
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
// 設(shè)置boundary的宏
#define Kboundary @"----WebKitFormBoundaryaItGoVAfuLHDoRD4"
#define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"點擊" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
// [self upload];
[self upload2];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
// 不推薦
-(void)upload
{
// 1. 創(chuàng)建會話管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
// 2. 確定URL
NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
// 2.1 創(chuàng)建請求對象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
// 2.2 設(shè)置請求方法
request.HTTPMethod = @"POST";
// 2.3 設(shè)置請求頭信息
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];
// 3. 發(fā)送請求上傳文件
/*
第一參數(shù): 請求對象
第二參數(shù): fromData 二進制數(shù)據(jù) 傳遞要上傳的數(shù)據(jù)(請求體)
第三參數(shù): progress 進度信息
第四參數(shù): completionHandler 下載完成后的回調(diào)
*/
NSURLSessionUploadTask * uploadTask = [manager uploadTaskWithRequest:request fromData:[self getBodyData] progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上傳進度:%f", 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
NSLog(@"%@",responseObject);
}];
// 執(zhí)行Task
[uploadTask resume];
}
-(void)upload2
{
// 1. 創(chuàng)建會話管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * dicM = @{
@"username":@"456123",
};
// 2. 發(fā)送post請求上傳文件
/*
第一參數(shù): 請求路徑
第二參數(shù): 字典(非文件參數(shù))
第三參數(shù): constructingBodyWithBlock 處理要上傳的文件數(shù)據(jù)
第四參數(shù): progress 進度回調(diào)
第五參數(shù): success 成功回調(diào) responseObject: 響應(yīng)體信息
第六參數(shù): failure 失敗回調(diào) error: 錯誤信息
*/
[manager POST:@"http://120.25.226.186:32812/upload" parameters:dicM constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
UIImage * image = [UIImage imageNamed:@"靜態(tài)05"];
NSData * imageData = UIImageJPEGRepresentation(image, 0.8);
// 使用formData 來拼接數(shù)據(jù)
/*
第一參數(shù): 二進制數(shù)據(jù) 要上傳的文件參數(shù)
第二參數(shù): 服務(wù)器規(guī)定的
第三參數(shù): 該文件上傳到服務(wù)器以什么名稱保存
第四參數(shù): mimeType
*/
// [formData appendPartWithFileData:imageData name:@"file" fileName:@"允兒" mimeType:@"image/jepg"];
// 方法二
// [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/WJim/Desktop/播放界面.jpg"] name:@"file" fileName:@"播放" mimeType:@"image/jepg" error:nil];
// 方法三
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/WJim/Desktop/播放界面.jpg"] name:@"file" error:nil];
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上傳進度:%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上傳成功------%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上傳失敗------%@",error);
}];
}
-(NSData *)getBodyData
{
NSMutableData * fileData = [NSMutableData data];
// 5.1 文件參數(shù)
/*
--分隔符
Content-Disposition: form-data; name="file"; filename="靜態(tài)05.jpg"
Content-Type: image/jpeg(MIMEType:大類型/小類型)
空行
文件參數(shù)
*/
NSData * oneData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:oneData];
// 把換行添加進請求體數(shù)據(jù)中
[fileData appendData:KNewLine];
// name:file 服務(wù)器規(guī)定的參數(shù)
// filename: 靜態(tài)05.jpg 文件保存到服務(wù)器上面的名稱
// Content-Type: 文件的類型
NSData * twoData = [@"Content-Disposition: form-data; name=\"file\"; filename=\"靜態(tài)05.jpg\"" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:twoData];
[fileData appendData:KNewLine];
NSData * thirdlyData = [@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:thirdlyData];
[fileData appendData:KNewLine];
[fileData appendData:KNewLine];
UIImage * image = [UIImage imageNamed:@"靜態(tài)05"];
// UIImage --> NSData
NSData * imageData = UIImageJPEGRepresentation(image, 0.5);
[fileData appendData:imageData];
[fileData appendData:KNewLine];
// 5.2 非文件參數(shù)
/*
--分隔符
Content-Disposition: form-data; name="username"
空行
456123
*/
NSData * sixthData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:sixthData];
[fileData appendData:KNewLine];
NSData * seventhData = [@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:seventhData];
[fileData appendData:KNewLine];
[fileData appendData:KNewLine];
NSData * ninthData = [@"456123" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:ninthData];
[fileData appendData:KNewLine];
// 5.3 結(jié)尾標識
NSData * tenthData = [[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:tenthData];
return fileData;
}
@end
監(jiān)控聯(lián)網(wǎng)狀態(tài)
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%d", status);
}];
具體代碼如下:
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property(nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"點擊" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
[self AFN];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
- (void)AFN
{
// 1. 獲得一個網(wǎng)絡(luò)狀態(tài)監(jiān)測管理者
AFNetworkReachabilityManager * manager = [AFNetworkReachabilityManager sharedManager];
// 2. 監(jiān)聽狀態(tài)的改變
/*
AFNetworkReachabilityStatusUnknown = -1, 未知
AFNetworkReachabilityStatusNotReachable = 0, 沒有網(wǎng)絡(luò)
AFNetworkReachabilityStatusReachableViaWWAN = 1, 蜂窩網(wǎng)絡(luò)
AFNetworkReachabilityStatusReachableViaWiFi = 2, Wifi
*/
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窩網(wǎng)絡(luò)");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"Wifi");
break;
case AFNetworkReachabilityStatusNotReachable :
NSLog(@"沒有網(wǎng)絡(luò)");
break;
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知錯誤");
break;
default:
break;
}
}];
// 開始監(jiān)聽
[manager startMonitoring];
}
@end
- 提示:要監(jiān)控網(wǎng)絡(luò)連接狀態(tài)责语,必須要先調(diào)用單例的startMonitoring方法