您的位置:首页 > 其它

新版AFNetworking2.5使用

2015-06-10 16:19 465 查看
官网下载2.5版本:http://afnetworking.com/

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

1.检测网络状态

[objc] view
plaincopy





+ (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方式获取数据

[objc] view
plaincopy





+ (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方式获取数据

[objc] view
plaincopy





+ (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数据

[objc] view
plaincopy





+ (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.下载文件

[objc] view
plaincopy





+ (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.文件上传-自定义上传文件名

[objc] view
plaincopy





+ (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.文件上传-随机生成文件名

[objc] view
plaincopy





+ (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://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-urlencoded

foo=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表单编码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: