新版AFNetworking2.5使用

来源:互联网 发布:开淘宝怎么拿货 编辑:程序博客网 时间:2024/05/10 05:09

官网下载2.5版本:http://afnetworking.com/

此文章是基于AFNetworking2.5版本的,需要看AFNetworking2.0版本的请看上一篇文章:AFNetworking2.0使用

1.检测网络状态

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. + (void)netWorkStatus  
  2. {  
  3.     /** 
  4.      AFNetworkReachabilityStatusUnknown          = -1,  // 未知 
  5.      AFNetworkReachabilityStatusNotReachable     = 0,   // 无连接 
  6.      AFNetworkReachabilityStatusReachableViaWWAN = 1,   // 3G 花钱 
  7.      AFNetworkReachabilityStatusReachableViaWiFi = 2,   // WiFi 
  8.      */  
  9.     // 如果要检测网络状态的变化,必须用检测管理器的单例的startMonitoring  
  10.     [[AFNetworkReachabilityManager sharedManager] startMonitoring];  
  11.       
  12.     // 检测网络连接的单例,网络变化时的回调方法  
  13.     [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
  14.         NSLog(@"%ld", status);  
  15.     }];  
  16. }  

可以用来监测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;        }
  1. if (!isExistenceNetwork) {  
  2.         MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
  3. //MBProgressHUD为第三方库,不需要可以省略或使用AlertView 
  4.         hud.removeFromSuperViewOnHide =YES;  
  5.         hud.mode = MBProgressHUDModeText;  
  6.         hud.labelText = NSLocalizedString(INFO_NetNoReachable, nil);  
  7.         hud.minSize = CGSizeMake(132.f, 108.0f); 
  8.         [hud hide:YES afterDelay:3];  
  9.           
  10.     }
}];

2.JSON方式获取数据

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. + (void)JSONDataWithUrl:(NSString *)url success:(void (^)(id json))success fail:(void (^)())fail;  
  2. {  
  3.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  4.       
  5.     NSDictionary *dict = @{@"format"@"json"};  
  6.     // 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情  
  7.     [manager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation, 
  8.               id responseObject) {  
  9.         if (success) {  
  10.             success(responseObject);  
  11.         }  
  12.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  13.         NSLog(@"%@", error);  
  14.         if (fail) {  
  15.             fail();  
  16.         }  
  17.     }];  
  18. }  

3.xml方式获取数据

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. + (void)XMLDataWithUrl:(NSString *)urlStr success:(void (^)(id xml))success fail:(void (^)())fail  
  2. {  
  3.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  4.       
  5.     // 返回的数据格式是XML  
  6.     manager.responseSerializer = [AFXMLParserResponseSerializer serializer];  
  7.       
  8.     NSDictionary *dict = @{@"format"@"xml"};  
  9.       
  10.     // 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情  
  11.     [manager GET:urlStr parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  12.         if (success) {  
  13.             success(responseObject);  
  14.         }  
  15.           
  16.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  17.         NSLog(@"%@", error);  
  18.         if (fail) {  
  19.             fail();  
  20.         }  
  21.     }];  
  22. }  

4.post提交json数据

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. + (void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id responseObject))success fail:(void (^)())fail  
  2. {  
  3.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  4.     // 设置请求格式  
  5.     manager.requestSerializer = [AFJSONRequestSerializer serializer];  
  6.     // 设置返回格式  
  7.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];  
  8.     [manager POST:urlStr parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  9. //        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
  10.         if (success) {  
  11.             success(responseObject);  
  12.         }  
  13.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  14.         NSLog(@"%@", error);  
  15.         if (fail) {  
  16.             fail();  
  17.         }  
  18.     }];  
  19.       
  20. }  

5.下载文件

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. + (void)sessionDownloadWithUrl:(NSString *)urlStr success:(void (^)(NSURL *fileURL))success fail:(void (^)())fail  
  2. {  
  3.     NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];  
  4.     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];  
  5.   
  6.     NSString *urlString = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  7.       
  8.     NSURL *url = [NSURL URLWithString:urlString];  
  9.     NSURLRequest *request = [NSURLRequest requestWithURL:url];  
  10.       
  11.     NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {  
  12.         // 指定下载文件保存的路径  
  13.         //        NSLog(@"%@ %@", targetPath, response.suggestedFilename);  
  14.         // 将下载文件保存在缓存路径中  
  15.         NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];  
  16.         NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];  
  17.           
  18.         // URLWithString返回的是网络的URL,如果使用本地URL,需要注意  
  19. //        NSURL *fileURL1 = [NSURL URLWithString:path];  
  20.         NSURL *fileURL = [NSURL fileURLWithPath:path];  
  21.           
  22. //        NSLog(@"== %@ |||| %@", fileURL1, fileURL);  
  23.         if (success) {  
  24.             success(fileURL);  
  25.         }  
  26.           
  27.         return fileURL;  
  28.     } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {  
  29.         NSLog(@"%@ %@", filePath, error);  
  30.         if (fail) {  
  31.             fail();  
  32.         }  
  33.     }];  
  34.       
  35.     [task resume];  
  36. }  

6.文件上传-自定义上传文件名

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. + (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL fileName:(NSString *)fileName fileType:(NSString *)fileTye success:(void (^)(id responseObject))success fail:(void (^)())fail  
  2. {  
  3.     // 本地上传给服务器时,没有确定的URL,不好用MD5的方式处理  
  4.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  5.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];  
  6.     //@"http://localhost/demo/upload.php"  
  7.     [manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {  
  8.           
  9. //        NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"头像1.png" withExtension:nil];  
  10.           
  11.         // 要上传保存在服务器中的名称  
  12.         // 使用时间来作为文件名 2014-04-30 14:20:57.png  
  13.         // 让不同的用户信息,保存在不同目录中  
  14. //        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
  15. //        // 设置日期格式  
  16. //        formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";  
  17. //        NSString *fileName = [formatter stringFromDate:[NSDate date]];  
  18.           
  19.         //@"image/png"  
  20.         [formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:fileTye error:NULL];  
  21.           
  22.     } success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  23.         if (success) {  
  24.             success(responseObject);  
  25.         }  
  26.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  27.         if (fail) {  
  28.             fail();  
  29.         }  
  30.     }];  
  31. }  

7.文件上传-随机生成文件名

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. + (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL success:(void (^)(id responseObject))success fail:(void (^)())fail  
  2. {  
  3.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  4.     // AFHTTPResponseSerializer就是正常的HTTP请求响应结果:NSData  
  5.     // 当请求的返回数据不是JSON,XML,PList,UIImage之外,使用AFHTTPResponseSerializer  
  6.     // 例如返回一个html,text...  
  7.     //  
  8.     // 实际上就是AFN没有对响应数据做任何处理的情况  
  9.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];  
  10.       
  11.     // formData是遵守了AFMultipartFormData的对象  
  12.     [manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {  
  13.           
  14.         // 将本地的文件上传至服务器  
  15. //        NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"头像1.png" withExtension:nil];  
  16.           
  17.         [formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL];  
  18.     } success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  19. //        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
  20. //          
  21. //        NSLog(@"完成 %@", result);  
  22.         if (success) {  
  23.             success(responseObject);  
  24.         }  
  25.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  26.         NSLog(@"错误 %@", error.localizedDescription);  
  27.         if (fail) {  
  28.             fail();  
  29.         }  
  30.     }];  

AFNetworking 2.5.0版本的使用

http://afnetworking.com/

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 FORM PARAMETER ENCODING

URL表单编码

[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
POST请求 http://example.com/Content-Type: application/x-www-form-urlencodedfoo=bar&baz[]=1&baz[]=2&baz[]=3

JSON PARAMETER ENCODING

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表单编码


0 0
原创粉丝点击