AFNetworking的一些基本使用

作者: 小吖朱 | 来源:发表于2017-01-21 12:39 被阅读0次

    首先介绍一下AFNetworking的基本情况

    AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。本指南将引导您完成这个过程。
    
    本指南是为了引导使用AFNetworking 2.x升级到最新的版本API,以达到过渡的目的,并且解释了新增和更改的设计结构。
    
    新设备要求: iOS 7, Mac OS X 10.9, watchOS 2, tvOS 9, & Xcode 7
    
    AFNetworking 3.0正式支持的iOS 7, Mac OS X的10.9, watchOS 2 , tvOS 9 和Xcode 7。如果你想使用AFNetworking在针对较旧版本的SDK项目,请检查README的兼容性信息。
    
    NSURLConnection的API已废弃
    
    AFNetworking 1.0建立在NSURLConnection的基础API之上 ,AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。 AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。由于Xcode 7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使NSURLSession向前发展。
    
    AFNetworking 2.X将继续获得关键的隐患和安全补丁,但没有新的功能将被添加。Alamofire(Swift下的网络请求)件基金会建议,所有的项目迁移到基于NSURLSession的API。
    
    弃用的类
    
    下面的类已从AFNetworking 3.0中废弃:
    
    AFURLConnectionOperation
    AFHTTPRequestOperation
    AFHTTPRequestOperationManager
    修改的类
    
    下面的类包含基于NSURLConnection的API的内部实现。他们已经被使用NSURLSession重构:
    
    UIImageView+AFNetworking
    UIWebView+AFNetworking
    UIButton+AFNetworking
    迁移
    
    AFHTTPRequestOperationManager 核心代码
    
    如果你以前使用 AFHTTPRequestOperationManager , 你将需要迁移去使用 AFHTTPSessionManager。 以下的类在两者过渡间并没有变化:
    
    securityPolicy
    requestSerializer
    responseSerializer
    接下来举一个关于AFHTTPSessionManager的简单例子。注意HTTP网络请求返回的不再是AFHTTPRequestOperation, 修改成为了NSURLSessionTask,并且成功和失败的Block块中的参数也变更为了NSURLSessionTask,而不再是AFHTTPRequestOperation。
    
    AFNetworking 2.x
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:@"请求的url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"成功");
    } failure:^(AFHTTPRequestOperation *operation, NSError*error) {
            NSLog(@"失败");
    }];
    AFNetworking 3.0
    
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    [session GET:@"请求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
            NSLog(@"成功");
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
            NSLog(@"失败");
    }];
    AFHTTPRequestOperation 核心代码
    
    与NSURLConnection对象不同,每个共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些NSURLSession对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。
    
    在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession则需要更多的开销,为了获得所要请求的数据。
    
    接下来,将要通过AFHTTPSessionManager创建一个单例,并创建一个任务和启动它。
    
    AFNetworking 2.x
    
    NSURL *URL = [NSURL URLWithString:@""];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    op.responseSerializer = [AFJSONResponseSerializer serializer];
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
    }];
    [[NSOperationQueue mainQueue] addOperation:op];
    AFNetworking 3.0
    
    NSURL *URL = [NSURL URLWithString:@""];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:URL.absoluteString parameters:nil success:^(NSURLSessionTask *task, id responseObject) {
            NSLog(@"JSON: %@", responseObject);
    } failure:^(NSURLSessionTask *operation, NSError *error) {
            NSLog(@"Error: %@", error);
    }];
    UIKit的迁移
    
    图片下载已经被重构,以遵循AlamofireImage架构与新的AFImageDownloader类。这个类的图片下载职责的代理人是UIButton与UIImageView的类目,并且提供了一些方法,在必要时可以自定义。类别中,下载远程图片的实际方法没有改变。
    
    UIWebView的类目被重构为使用AFHTTPSessionManager作为其网络请求。
    
    UIAlertView的类目被废弃
    
    从AFNetworking 3.0后UIAlertView的类目因过时而被废弃。并没有提供UIAlertController类目的计划,因为这是应用程序应处理的逻辑,而不是这个库。
    

    以上是对AFNetworking基本使用的一些资料!下面来说一说AFNetworking的基本使用

    手下你说一说AFNetworking的get和post请求,代码如下

    getRequest
        //1.创建会话管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        //http://120.25.226.186:32812/login?username=123&pwd=122&type=JSON
        //
        
        NSDictionary *paramDict = @{
                                    @"username":@"dandan",
                                    @"pwd":@"dandan",
                                    @"type":@"JSON"
                                    };
        //2.发送GET请求
        /*
         第一个参数:请求路径(不包含参数).NSString
         第二个参数:字典(发送给服务器的数据~参数)
         第三个参数:progress 进度回调
         第四个参数:success 成功回调
                    task:请求任务
                    responseObject:响应体信息(JSON--->OC对象)
         第五个参数:failure 失败回调
                    error:错误信息
         响应头:task.response
         */
        [manager GET:@"http://168.192.1.18:33322/login" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"%@---%@",[responseObject class],responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败--%@",error);
        }];
    

    postRequest

    //1.创建会话管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        NSDictionary *paramDict = @{
                                    @"username":@"dandan",
                                    @"pwd":@"dandan",
                                    @"type":@"JSON"
                                    };
        //2.发送GET请求
        /*
         第一个参数:请求路径(不包含参数).NSString
         第二个参数:字典(发送给服务器的数据~参数)
         第三个参数:progress 进度回调
         第四个参数:success 成功回调
            task:请求任务
            responseObject:响应体信息(JSON--->OC对象)
         第五个参数:failure 失败回调
            error:错误信息
         响应头:task.response
         */
        [manager POST:@"http://168.192.1.18:33322/login" parameters:paramDict 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请求列举了一下!下面说一下它一些高级的使用
    使用AFNetworking下载文件,废话不多说直接上代码

      //1.创建会话管理者
        AFHTTPSessionManager *manager =[AFHTTPSessionManager manager];
        
        NSURL *url = [NSURL URLWithString:@"http://168.192.1.18:33322/resources/videos/minion_01.mp4"];
        
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        //2.下载文件
        /*
         第一个参数:请求对象
         第二个参数:progress 进度回调 downloadProgress
         第三个参数:destination 回调(目标位置)
                    有返回值
                    targetPath:临时文件路径
                    response:响应头信息
         第四个参数:completionHandler 下载完成之后的回调
                    filePath:最终的文件路径
         */
        NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
            
            //监听下载进度
            //completedUnitCount 已经下载的数据大小
            //totalUnitCount     文件数据的中大小
            NSLog(@"%f",1.0 *downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
            
        } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
            
            NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
            
            NSLog(@"targetPath:%@",targetPath);
            NSLog(@"fullPath:%@",fullPath);
            
            return [NSURL fileURLWithPath:fullPath];
        } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
            
            NSLog(@"%@",filePath);
        }];
        
        //3.执行Task
        [download resume];
    

    执行上面的代码就可以实现基本的网络下载数据 。

    上面说完AFNetworking的文件下载,我们再说一下文件上传。下面上代码!

    这种方法不推荐,下面另外会介绍几种不一样的方法!

      //    这种方法不推荐,再使用的过程中 使用过程中泰繁琐!  下面会推荐另一种方法!    
        //1.创建会话管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        //2.1url
        NSURL *url = [NSURL URLWithString:@"http://168.192.1.18:33322/upload"];
        
        //2.2创建请求对象
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        
        //2.3 设置请求方法
        request.HTTPMethod = @"POST";
        
        //2.4 设请求头信息  这个请求头信息必须要设置。
        [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];
        
        //3.发送请求上传文件
        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);
        }];
        
        //4.执行task
        [uploadTask resume];
    

    下面是另一种方法进行上传文件

      //1.创建会话管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
    //    NSDictionary *dictM = @{}
        //2.发送post请求上传文件
        /*
         第一个参数:请求路径
         第二个参数:字典(非文件参数)
         第三个参数:constructingBodyWithBlock 处理要上传的文件数据
         第四个参数:进度回调
         第五个参数:成功回调 responseObject:响应体信息
         第六个参数:失败回调
         */
        [manager POST:@"http://168.192.1.18:33322/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            
            UIImage *image = [UIImage imageNamed:@"Snip20160227_128"];
            NSData *imageData = UIImagePNGRepresentation(image);
            
            //使用formData来拼接数据
            /*
             第一个参数:二进制数据 要上传的文件参数
             第二个参数:服务器规定的
             第三个参数:该文件上传到服务器以什么名称保存
             */
            //[formData appendPartWithFileData:imageData name:@"file" fileName:@"xxxx.png" mimeType:@"image/png"];
            
            //[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/Da/Desktop/Snip20160227_128.png"] name:@"file" fileName:@"123.png" mimeType:@"image/png" error:nil];
            
            [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/Snip20160227_128.png"] 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);
        }];
    

    相关文章

      网友评论

        本文标题:AFNetworking的一些基本使用

        本文链接:https://www.haomeiwen.com/subject/xzngbttx.html