官網下載2.5版本:http://afnetworking.com/
此文章是基於AFNetworking2.5版本的,需要看AFNetworking2.0版本的請看上一篇文章:AFNetworking2.0使用
1.檢測網絡狀態
- + (void)netWorkStatus
- {
- /**
- AFNetworkReachabilityStatusUnknown = -1, // 未知
- AFNetworkReachabilityStatusNotReachable = 0, // 無連接
- AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花錢
- AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi
- */
- // 如果要檢測網絡狀態的變化,必須用檢測管理器的單例的startMonitoring
- [[AFNetworkReachabilityManager sharedManager] startMonitoring];
- // 檢測網絡連接的單例,網絡變化時的回調方法
- [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
- NSLog(@"%ld", status);
- }];
- }
可以用來監測WWAN或者WiFi或者斷網狀態;)
// 基準baseURL
BOOL isExistenceNetwork = YES;
NSURL *baseURL = [NSURL URLWithString:@"http://baidu.com/"];
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]
initWithBaseURL:baseURL];
NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
isExistenceNetwork = YES;
break; case AFNetworkReachabilityStatusReachableViaWiFi:isExistenceNetwork = YES;break;
case AFNetworkReachabilityStatusNotReachable:
default: [operationQueue setSuspended:YES]; // 此處可以發送斷網通知
isExistenceNetwork = NO;
break; }
}];
- if (!isExistenceNetwork) {
- MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
- //MBProgressHUD爲第三方庫,不需要可以省略或使用AlertView
- hud.removeFromSuperViewOnHide =YES;
- hud.mode = MBProgressHUDModeText;
- hud.labelText = NSLocalizedString(INFO_NetNoReachable, nil);
- hud.minSize = CGSizeMake(132.f, 108.0f);
- [hud hide:YES afterDelay:3];
- }
2.JSON方式獲取數據
- + (void)JSONDataWithUrl:(NSString *)url success:(void (^)(id json))success fail:(void (^)())fail;
- {
- AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
- NSDictionary *dict = @{@"format": @"json"};
- // 網絡訪問是異步的,回調是主線程的,因此程序員不用管在主線程更新UI的事情
- [manager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation,
- id responseObject) {
- if (success) {
- success(responseObject);
- }
- } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
- NSLog(@"%@", error);
- if (fail) {
- fail();
- }
- }];
- }
3.xml方式獲取數據
- + (void)XMLDataWithUrl:(NSString *)urlStr success:(void (^)(id xml))success fail:(void (^)())fail
- {
- AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
- // 返回的數據格式是XML
- manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
- NSDictionary *dict = @{@"format": @"xml"};
- // 網絡訪問是異步的,回調是主線程的,因此程序員不用管在主線程更新UI的事情
- [manager GET:urlStr parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
- if (success) {
- success(responseObject);
- }
- } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
- NSLog(@"%@", error);
- if (fail) {
- fail();
- }
- }];
- }
4.post提交json數據
- + (void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id responseObject))success fail:(void (^)())fail
- {
- AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
- // 設置請求格式
- manager.requestSerializer = [AFJSONRequestSerializer serializer];
- // 設置返回格式
- manager.responseSerializer = [AFHTTPResponseSerializer serializer];
- [manager POST:urlStr parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
- // NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
- if (success) {
- success(responseObject);
- }
- } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
- NSLog(@"%@", error);
- if (fail) {
- fail();
- }
- }];
- }
5.下載文件
- + (void)sessionDownloadWithUrl:(NSString *)urlStr success:(void (^)(NSURL *fileURL))success fail:(void (^)())fail
- {
- NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
- AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];
- NSString *urlString = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- NSURL *url = [NSURL URLWithString:urlString];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
- // 指定下載文件保存的路徑
- // NSLog(@"%@ %@", targetPath, response.suggestedFilename);
- // 將下載文件保存在緩存路徑中
- NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
- NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];
- // URLWithString返回的是網絡的URL,如果使用本地URL,需要注意
- // NSURL *fileURL1 = [NSURL URLWithString:path];
- NSURL *fileURL = [NSURL fileURLWithPath:path];
- // NSLog(@"== %@ |||| %@", fileURL1, fileURL);
- if (success) {
- success(fileURL);
- }
- return fileURL;
- } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
- NSLog(@"%@ %@", filePath, error);
- if (fail) {
- fail();
- }
- }];
- [task resume];
- }
6.文件上傳-自定義上傳文件名
- + (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL fileName:(NSString *)fileName fileType:(NSString *)fileTye success:(void (^)(id responseObject))success fail:(void (^)())fail
- {
- // 本地上傳給服務器時,沒有確定的URL,不好用MD5的方式處理
- AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
- manager.responseSerializer = [AFHTTPResponseSerializer serializer];
- //@"http://localhost/demo/upload.php"
- [manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
- // NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];
- // 要上傳保存在服務器中的名稱
- // 使用時間來作爲文件名 2014-04-30 14:20:57.png
- // 讓不同的用戶信息,保存在不同目錄中
- // NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
- // // 設置日期格式
- // formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
- // NSString *fileName = [formatter stringFromDate:[NSDate date]];
- //@"image/png"
- [formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:fileTye error:NULL];
- } success:^(AFHTTPRequestOperation *operation, id responseObject) {
- if (success) {
- success(responseObject);
- }
- } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
- if (fail) {
- fail();
- }
- }];
- }
7.文件上傳-隨機生成文件名
- + (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL success:(void (^)(id responseObject))success fail:(void (^)())fail
- {
- AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
- // AFHTTPResponseSerializer就是正常的HTTP請求響應結果:NSData
- // 當請求的返回數據不是JSON,XML,PList,UIImage之外,使用AFHTTPResponseSerializer
- // 例如返回一個html,text...
- //
- // 實際上就是AFN沒有對響應數據做任何處理的情況
- manager.responseSerializer = [AFHTTPResponseSerializer serializer];
- // formData是遵守了AFMultipartFormData的對象
- [manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
- // 將本地的文件上傳至服務器
- // NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];
- [formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL];
- } success:^(AFHTTPRequestOperation *operation, id responseObject) {
- // NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
- //
- // NSLog(@"完成 %@", result);
- if (success) {
- success(responseObject);
- }
- } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
- NSLog(@"錯誤 %@", error.localizedDescription);
- if (fail) {
- fail();
- }
- }];
AFNetworking 2.5.0版本的使用
http://cocoadocs.org/docsets/AFNetworking/2.5.0/
1. 下載源碼並進行編譯
源碼地址 http://pan.baidu.com/s/1jG24w3W
2. 判斷當前是否有網絡,基準網址爲 http://baidu.com/
源碼:
可以用來監測WWAN或者WiFi或者斷網狀態;)
// 基準baseURL NSURL *baseURL = [NSURL URLWithString:@"http://baidu.com/"]; AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL]; NSOperationQueue *operationQueue = manager.operationQueue; [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusReachableViaWWAN: case AFNetworkReachabilityStatusReachableViaWiFi: [operationQueue setSuspended:NO]; // 此處可以發送有網絡通知 NSLog(@"有網絡"); break; case AFNetworkReachabilityStatusNotReachable: default: [operationQueue setSuspended:YES]; // 此處可以發送斷網通知 NSLog(@"斷網了"); break; } }]; // 開始監測網絡 [manager.reachabilityManager startMonitoring];
3. 不帶參數的GET請求
源碼:
// 初始化網址 NSString *requestAddress = \ @"http://api.openweathermap.org/data/2.5/forecast/daily?lat=39.88293652833437&lon=116.4621119300779&lang=zh_cn"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 不帶參數的GET請求 [manager GET:requestAddress parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
4. 帶參數GET的請求
源碼:
// 初始化網址 NSString *requestAddress = \ @"http://api.openweathermap.org/data/2.5/forecast/daily"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 參數的GET請求 [manager GET:requestAddress parameters:@{@"lat" : @"39.88293652833437", @"lon" : @"116.4621119300779", @"lang" : @"zh_cn"} success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
5. 不帶參數的POST請求
源碼:
// 初始化網址 NSString *cityName = [@"北京" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *requestAddress = \ [NSString stringWithFormat:@"http://apis.haoservice.com/weather?cityname=%@&key=1d309cc633984df791b51f48ddf09d4b", cityName]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer.acceptableContentTypes = \ [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; // 不帶參數的POST請求 [manager POST:requestAddress parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
6. 帶參數的POST請求
源碼:
// 初始化網址 NSString *cityName = [@"北京" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *requestAddress = \ [NSString stringWithFormat:@"http://apis.haoservice.com/weather"]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer.acceptableContentTypes = \ [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; // 帶參數的POST請求 [manager POST:requestAddress parameters:@{@"cityname" : cityName, @"key" : @"1d309cc633984df791b51f48ddf09d4b"} success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
附錄:
基於URL-form-encodes Body方式的POST請求
// 初始化網址 NSString *cityName = [@"北京" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *requestAddress = \ [NSString stringWithFormat:@"http://apis.haoservice.com/weather"]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 創建 URL-form-encodes HTTP message bodies manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 接受的數據類型 manager.responseSerializer.acceptableContentTypes = \ [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; // 帶參數的POST請求 [manager POST:requestAddress parameters:@{@"cityname" : cityName, @"key" : @"1d309cc633984df791b51f48ddf09d4b"} success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
7. 文件下載
// // ViewController.m // AFNetworking2.5.0 // // Created by XianMingYou on 15/2/14. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 定義一個progress指針 NSProgress *progress; // 創建一個URL鏈接 NSURL *url = [NSURL URLWithString:@"http://41.duote.com.cn/2345explorer.exe"]; // 初始化一個請求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 獲取一個Session管理器 AFHTTPSessionManager *session = [AFHTTPSessionManager manager]; // 開始下載任務 NSURLSessionDownloadTask *downloadTask = \ [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { // 拼接一個文件夾路徑 NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; // 根據網址信息拼接成一個完整的文件存儲路徑並返回給block return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { // 結束後移除掉這個progress [progress removeObserver:self forKeyPath:@"fractionCompleted" context:nil]; }]; // 設置這個progress的唯一標示符 [progress setUserInfoObject:@"someThing" forKey:@"Y.X."]; [downloadTask resume]; // 給這個progress添加監聽任務 [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil]; } - (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; NSLog(@"Progress is %f", progress.fractionCompleted); } } @end
8. 文件上傳
單文件上傳 - (沒有辦法做試驗演示)
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"Error: %@", error); } else { NSLog(@"Success: %@ %@", response, responseObject); } }]; [uploadTask resume];
多文件上傳 - (沒有辦法做試驗演示)
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil]; } error:nil]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSProgress *progress = nil; NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"Error: %@", error); } else { NSLog(@"%@ %@", response, responseObject); } }]; [uploadTask resume];
9. Request Serialization
Request serializers create requests from URL strings, encoding parameters as either a query string or HTTP body.
請求序列化是爲了從URL字符串創建出編碼後的參數,或者是序列字典,或者是HTTP實體.
NSString *URLString = @"http://example.com";
NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};
QUERY STRING PARAMETER ENCODING
字符串序列編碼
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
GET請求 http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3
URL表單編碼
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
POST請求 http://example.com/
Content-Type: application/x-www-form-urlencoded
foo=bar&baz[]=1&baz[]=2&baz[]=3
JSON編碼
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
POST請求 http://example.com/
Content-Type: application/json
{"foo": "bar", "baz": [1,2,3]}
注: POST分爲JSON或者URL表單編碼