美文网首页ios网络编程
iOS 开发之网络编程(二)

iOS 开发之网络编程(二)

作者: DB001 | 来源:发表于2020-06-08 14:28 被阅读0次

    第三方网络框架
    • AFNetworking

    一款轻量级网络请求开源框架,基于iOSmac OS 网络进行扩展的高性能框架,大大降低了iOS开发工程师处理网络请求的难度,让iOS开发变成一件愉快的事情。

    • AFNetworking优点

    1.原有基础urlsesson上封装了一层,在传参方面更灵活,
    2.回调更友好,
    3.支持返回数据序列化
    4.支持文件上传,断点下载,
    5.自带多线程,防死锁
    6.处理了Https证书流程,节省移动端开发
    7.支持网络状态判断

    AFN.jpeg
    • AFNetWorking发送POST&GET请求:
    #import "ViewController.h"
    #import "AFNetworking.h"
    
    @interface ViewController ()
    
    @property (strong, nonatomic)AFHTTPSessionManager *manager;
    
    @end
    
    @implementation ViewController
    
    - (AFHTTPSessionManager *)manager{
        
        if (!_manager) {
            _manager = [AFHTTPSessionManager manager];
        }
        
        return _manager;
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        
    //    [self getData];
        
        
        [self postData];
        
    }
    
    - (void)postData{
        
        NSString *path = @"http://120.25.226.186:32812/login";
        NSDictionary *parames=@{
                                @"username":@"520it",
                                @"pwd":@"520it",
                                @"type":@"JSON"
                                };
        [self.manager POST:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"success:----%@-%@",[responseObject class],responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"failuer:----%@",error);
        }];
        
    }
    
    - (void)getData{
        
    //    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        /**
         * 参数说明
         *
         * 第一个参数:请求的路径(NSString)不包含参数
         * 第二个参数:需要传入的参数
         * 第三个参数:附加到此请求的默认头的头
         * 第四个参数:请求数据的进度
         * 第五个参数:请求成功后的回调
         *           task:可以拿到响应头信息
                     responseObject:响应体信息 AFN内部默认对服务器返回数据进行json解析
         *
         * 第六个参数:请求失败后的回调
         *
         */
        NSString *path = @"http://120.25.226.186:32812/login";
        NSDictionary *parames=@{
                                @"username":@"520it",
                                @"pwd":@"520it",
                                @"type":@"JSON"
                                };
        [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"success:----%@-%@",[responseObject class],responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"failuer:----%@",error);
            
        }];
        
    }
    @end
    

    -AFNetWorking文件下载&上传

    #import "ViewController.h"
    #import "AFNetworking.h"
    
    @interface ViewController ()
    
    @property (strong, nonatomic)AFHTTPSessionManager *manager;
    
    @end
    
    @implementation ViewController
    
    - (AFHTTPSessionManager *)manager{
        
        if (!_manager) {
            
            _manager = [AFHTTPSessionManager manager];
            
        }
        
        return _manager;
        
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        
    //    [self downLoad];
        
        [self upLoad];
        
    }
    
    //上传
    - (void)upLoad{
        
        NSString *urlPath = @"http://120.25.226.186:32812/upload";
        NSDictionary *params = @{
                                @"username":@"aaaaa"
                                };
        /**
         * 参数说明
         *
         * 第一个参数:请求路径
         * 第二个参数:非文件参数:oc的字典(NSDictionary)
         * 第三个参数:constructingBodyWithBlock 处理要上传的文件参数的
         * 第四个参数:progress进度的回调
         * 第五个参数:success上传成功的回调
         *           task
         *           responseObject响应体信息(内部已经完成了JSON解析)
         * 第六个参数:failure上传失败的回调
         *
         */
        
        [self.manager POST:urlPath parameters:params headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            //id<AFMultipartFormData>协议:遵守这个协议就可以该协议中的方法
            
            //处理要上传的文件
    
            NSString *path = @"/Users/nana/Desktop/timg.jpeg";
            NSURL *url = [NSURL fileURLWithPath:path];
        
            //第一种方法
            
            /**
             * 参数说明
             *
             * 第一个参数:FileData:要上传文件的二进制数据
             * 第二个参数:name:具体的数值 file
             * 第三个参数:fileName:文件的名称
             * 第四个参数:mimeType:文件的二进制数据类型
             *
             */
            
    //        NSData *imageData = [NSData dataWithContentsOfFile:path];
    //        [formData appendPartWithFileData:imageData name:@"file" fileName:url.lastPathComponent mimeType:@"image/jpeg"];
            
            //第二种方法
            
            /**
             * 参数说明
             *
             * 第一个参数:FileURL:本地文件的URL路径
             * 第二个参数:name:具体的数值 file
             * 第三个参数:mimeType:文件的二进制数据类型
             *
             */
    //        [formData appendPartWithFileURL:url name:@"file" fileName:url.lastPathComponent mimeType:@"image/jpeg" error:nil];
            
            //第三种方法
            
            /**
             * 参数说明
             *
             * 第一个参数:FileURL:本地文件的URL路径
             * 第二个参数:name:具体的数值 file
             *
             */
            [formData appendPartWithFileURL:url name:@"file" error:nil];
            
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            
            //计算进度信息
        NSLog(@"进度信息:%f",1.0*uploadProgress.completedUnitCount/uploadProgress.totalUnitCount);
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"success:%@",responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"failure:%@",error);
            
        }];
        
        
    }
    
    
    //下载
    - (void)downLoad{
        
         NSURL *url = [NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591442074704&di=760001ecc8d2d0df7d98a8d6cc083bce&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F68%2F61%2F300000839764127060614318218_950.jpg"];
    
         NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        /**
         * 参数说明
         *
         * 第一个参数:Request:请求对象
         * 第二个参数:progress:进度回调
         * 第三个参数:destination回调:需要在该回调中告诉方法应该把下载的文件保存到哪里
         *           targetPath:默认返回的临时存储路径(tmp)
         *           response:响应头信息
         *           返回值:文件应该的存储路径
         * 第四个参数:completionHandler:完成后的回调
         *
         */
         NSURLSessionDownloadTask *downLoadTask = [self.manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
    
            NSLog(@"下载进度:%f",1.0*downloadProgress.completedUnitCount/downloadProgress.totalUnitCount);
            
         }destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
    
            //拼接文件的存储路径给AFN,内部会自动的完成文件的剪切处理
            NSLog(@"targetPath: %@",targetPath);
    
            NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
            
            NSString *fileName = response.suggestedFilename;
            
            NSString *fullPath = [cachesPath stringByAppendingPathComponent:fileName];
            
            NSLog(@"fullPath:%@",fullPath);
            
            return [NSURL fileURLWithPath:fullPath];
            
         }completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
    
            //filePath:文件的路径(即上面回调的返回值)
            NSLog(@"filePath:%@",filePath);
            
         }];
    
         [downLoadTask resume];
    }
    @end
    
    • AFNetworkingJson&Xml解析

    manager = [AFHTTPSessionManager manager];

    manager:内部默认已经对服务器返回的数据进行了JSON解析操作AFJSONResponseSerializer

    manager:如果返回的数据是XML类型:需要调整manager对响应的解析方式:AFXMLParserResponseSerializer
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

    manager:如果返回的数据类型既不是json也不是xml
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    #import "ViewController.h"
    #import "AFNetworking.h"
    
    @interface ViewController ()<NSXMLParserDelegate>
    
    @property (strong, nonatomic)AFHTTPSessionManager *manager;
    /**
     * <#注释#>
     */
    @property (strong, nonatomic)NSMutableArray *dataArray;
    @end
    
    @implementation ViewController
    
    - (NSMutableArray *)dataArray{
        
        if (!_dataArray) {
            _dataArray = [NSMutableArray array];
        }
        
        return _dataArray;
    }
    
    
    - (AFHTTPSessionManager *)manager{
        
        if (!_manager) {
            
            _manager = [AFHTTPSessionManager manager];
       
          //_manager:内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
      //_manager:如果返回的数据是XML类型:需要调整manager对响应的解析方式:AFXMLParserResponseSerializer
            
            //        _manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
            
            //_manager:如果返回的数据类型既不是json也不是xml
    
            _manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        }
        
        return _manager;
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        
        
    //    [self getJson];
        
    //    [self getXML];
        
    //    [self httpData];
        
    }
    
    - (void)httpData{
        
        NSString *path = @"http://www.baidu.com";
        NSDictionary *parames=nil;
        
        [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"success:----%@",responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"failuer:----%@",error);
            
        }];
        
    }
    
    - (void)getXML{
        
        NSString *path = @"http://120.25.226.186:32812/video";
        
        NSDictionary *parames=@{
                                @"type":@"XML"
                                };
        
        [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"success:----%@-%@",[responseObject class],responseObject);
            
            //使用NSXMLParser解析数据
            
            //01 创建解析器
            NSXMLParser *parser = (NSXMLParser *)responseObject;
            
            //02 设置代理
            parser.delegate = self;
            //03 开始解析
            [parser parse];
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"failuer:----%@",error);
            
        }];
        
    }
    
    - (void)getJson{
        
        
        NSString *path = @"http://120.25.226.186:32812/video";
        NSDictionary *parames=@{
                                @"type":@"JSON"
                                };
        
        //内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
        [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"success:----%@-%@",[responseObject class],responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"failuer:----%@",error);
            
        }];
        
    }
    
    #pragma---------------------------------------
    #pragma MARK - NSXMLParserDelegate
    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
        
        NSLog(@"%@ - \n -%@",elementName,attributeDict);
        
        [self.dataArray addObject:attributeDict];
        
    }
    
    @end
    
    • AFNetworking 网络状态监听
    - (void)netStateType{
        
        //01 创建网络监听管理者对象
        AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager manager];
        //02 监听
        [netManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            
            //当监听网络装调改变的时候,就会调用block,并且把当前的网络状态作为参数传递给block
            /**
             typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
                 AFNetworkReachabilityStatusUnknown          = -1,
                 AFNetworkReachabilityStatusNotReachable     = 0,
                 AFNetworkReachabilityStatusReachableViaWWAN = 1,
                 AFNetworkReachabilityStatusReachableViaWiFi = 2,
             };
             */
            switch (status) {
                    
                case AFNetworkReachabilityStatusUnknown:
                    NSLog(@"未知的网络状态");
                    break;
                    
                case AFNetworkReachabilityStatusNotReachable:
                    NSLog(@"没有网络");
                    break;
                    
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    NSLog(@"蜂窝网络");
                    break;
                    
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    NSLog(@"WiFi网络");
                    break;
                    
                default:
                    break;
            }
        }];
        
        //03 开始监听
        [netManager startMonitoring];
        
    }
    

    相关文章

      网友评论

        本文标题:iOS 开发之网络编程(二)

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