iOS 第三方开源库----->AFNetworking使用总结
配置

       1.下载AFNetworking,将2个文件夹:AFNetworking和UIKit+AFNetworking拖入工程

       2.导入以下库文件:CFNetwork、Security、SystemConfiguration、MobileCoreServices

       3.如果你以前用的是1.0版本,那么AFNetworking 2.0 Migration Guide能帮助你

       4.如果你是用CocoaPods配置的,那么

           platform:ios,'7.0'

           pod"AFNetworking","~>2.0"

一、2大管理对象

1.AFHTTPRequestOperationManager
* 对NSURLConnection的封装

2.AFHTTPSessionManager
* 对NSURLSession的封装

二、对服务器返回数据的解析

1.AFN可以自动对服务器返回的数据进行解析
* 默认将服务器返回的数据当做JSON来解析

2.设置对服务器返回数据的解析方式
1> 当做是JSON来解析(默认做法)
* mgr.responseSerializer = [AFJSONResponseSerializer serializer];
* responseObject的类型是NSDictionary或者NSArray

2> 当做是XML来解析
* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
* responseObject的类型是NSXMLParser

3> 直接返回data
* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可
* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

3.注意
* 服务器返回的数据一定要跟responseSerializer对得上
1> 服务器返回的是JSON数据
* AFJSONResponseSerializer
* AFHTTPResponseSerializer

2> 服务器返回的是XML数据
* AFXMLParserResponseSerializer
* AFHTTPResponseSerializer

3> 服务器返回的是其他数据
* AFHTTPResponseSerializer

三、AFHTTPRequestOperationManager的具体使用


1.创建管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
2.封装请求参数

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"哈哈哈";

params[@"pwd"] = @"123";

3.发送请求

NSString *url = @"http://localhost:8080/MJServer/login";

[mgr POST:url parameters:params

  success:^(AFHTTPRequestOperation *operation, id responseObject) {

      // 请求成功的时候调用这个block

      NSLog(@"请求成功---%@", responseObject);

  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

      // 请求失败的时候调用调用这个block

      NSLog(@"请求失败");

  }];

// GET请求

[mgr GET:url parameters:params

  success:^(AFHTTPRequestOperation *operation, id responseObject) {

      // 请求成功的时候调用这个block

      NSLog(@"请求成功---%@", responseObject);

  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

      // 请求失败的时候调用调用这个block

      NSLog(@"请求失败");

  }];
文件上传
1.采用AFHTTPRequestOperationManager,无法显示文件进度
 // 2.发送一个请求
    NSString *url = @"http://localhost:8080/MJServer/upload";
    [mgr POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        // 在发送请求之前会自动调用这个block
        // 需要在这个block中添加文件参数到formData中
        
        /**
         FileURL : 需要上传的文件的URL路径
         name : 服务器那边接收文件用的参数名
         fileName : (告诉服务器)所上传文件的文件名
         mimeType : 所上传文件的文件类型
         */
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"itcast" withExtension:@"txt"];
        [formData appendPartWithFileURL:url name:@"file" fileName:@"test.txt" mimeType:@"text/plain" error:nil];
        
        /**
         FileData : 需要上传的文件的具体数据
         name : 服务器那边接收文件用的参数名
         fileName : (告诉服务器)所上传文件的文件名
         mimeType : 所上传文件的文件类型
         */
        //        UIImage *image = [UIImage imageNamed:@"minion_01"];
        //        NSData *fileData = UIImagePNGRepresentation(image);
        //        [formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.png" mimeType:@"image/png"];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"上传成功");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"上传失败");
    }];

2.采用

AFHTTPRequestOperation 可以显示文件进度

- (void)uploadImage:(UIImage *)image path:(NSString *)path name:(NSString *)name
       successBlock:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
       failureBlock:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
      progerssBlock:(void (^)(CGFloat progressValue))progress
{
    NSData *data = UIImageJPEGRepresentation(image, 1.0);
    if ((float)data.length/1024 > 1000)
    {
        data = UIImageJPEGRepresentation(image, 1024*1000.0/(float)data.length);
    }
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyyMMddHHmmss";
    NSString *str = [formatter stringFromDate:[NSDate date]];
    NSString *fileName = [NSString stringWithFormat:@"%@_%@.jpg", [Login curLoginUser].global_key, str];
    DebugLog(@"\nuploadImageSize\n%@ : %.0f,name = %@", fileName, (float)data.length/1024,name);

    AFHTTPRequestOperation *operation = [self POST:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
    {
        [formData appendPartWithFileData:data name:name fileName:fileName mimeType:@"image/jpeg"];
    }
    success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject);
        id error = [self handleResponse:responseObject];
        if (error && failure) {
            failure(operation, error);
        }else{
            success(operation, responseObject);
        }
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        NSLog(@"Error: %@ ***** %@", operation.responseString, error);
        if (failure) {
            failure(operation, error);
        }
    }];
    
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite)
    {
        CGFloat progressValue = (float)totalBytesWritten/(float)totalBytesExpectedToWrite;
        if (progress)
        {
            progress(progressValue);
        }
    }];
    [operation start];
}
View Code

 

4.AFURLSessionManager(NSURLSession详细见网络编程(6))

      创建和管理制定的NSURLSession对象NSURLSessionConfiguration对象必须实现<NSURLSessionTaskDelegate>, <NSURLSessionDataDelegate>, <NSURLSessionDownloadDelegate>, <NSURLSessionDelegate>协议

      创建一个下载任务

      创建一个上传任务

 

 
      创建一个带多表,进度的上传任务

 

 

     
创建一个数据流Data任务

              

 3.网络监测(一般会用另一个网络监测类,Reachability,还有JSON解析方法,反正我也一般不用,自行脑补)

       AFNetworkReachabilityManager监控网络领域的可达性,WWAN地址和WiFi接口.

       当前网络状态

  HTTP Manager 可达性 
 

4.AFHTTPRequestOperation

      AFHTTPRequestOperation是使用HTTP或HTTPS协议的AFURLConnectionOperation的子类。
它封装的获取后的HTTP状态和类型将决定请求的成功与否。虽然AFHTTPRequestOperationManager通常是最好的去请求的方式,但是AFHTTPRequestOpersion也能够单独使用。


      GET请求

 

      批量多请求

 

AFNetworking 2.x 设置header

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

//设置接收类型

  manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"application/json",@"text/html",nil];

 

posted on 2015-06-24 11:11  pTrack  阅读(328)  评论(0)    收藏  举报