美文网首页
AFN 基本使用

AFN 基本使用

作者: EricLihuifeng | 来源:发表于2018-04-08 16:45 被阅读5次
    • GET&POST 请求
    • 文件下载
    • 文件上传
    • 序列化处理
    • 监听网络状态

    GET 方式发送请求

    - (void)get{
        // 1 创建会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        NSDictionary *dic = @{
                              @"username":@"520it",
                              @"pwd":@"520it",
                              @"type":@"JSON"
                              };
        
        // 2 发送GET请求
        /* 参数说明
         * 第一个参数:请求路径 NSString类型 不可以包含参数
         * 第二个参数:参数信息字典
         * 第三个参数:progress 进度回调
         * 第四个参数:success 成功回调
         *           task: 请求任务 可以通过task得到响应头信息
         *           responseObject: 响应体 AFN内部默认对服务器返回的数据进行JSON解析
         * 第五个参数:failure 失败回调
         */
        [manager GET:@"http://120.25.226.186:32812/login" parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"请求成功 -- %@,%@",[responseObject class],responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败-- %@",error);
        }];
    }
    

    POST方式发送请求

    - (void)post{
        // 1 创建会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        NSDictionary *dic = @{
                              @"username":@"520it",
                              @"pwd":@"520it",
                              @"type":@"JSON"
                              };
        
        // 2 发送POST请求
         [manager POST:@"http://120.25.226.186:32812/login" parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"请求成功 -- %@,%@",[responseObject class],responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败-- %@",error);
        }];
    }
    
    

    文件下载

    - (void)download{
        
        // 1 创建会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        // 2 创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://f.hiphotos.baidu.com/zhidao/pic/item/a71ea8d3fd1f4134fadc747f261f95cad0c85ec3.jpg"]];
        
        // 3 创建请求任务
        /* 参数说明
         * 第一个参数:请求对象
         * 第二个参数:progress 进度回调
         * 第三个参数:destination回调 需要在该回调中告诉方法应该把下载的文件保存哪里
                    targetPath: 默认写入的临时保存路径 (tmp)
                    response:   响应头信息
                    返回值: 文件应该保存的路径
         * 第四个参数:completionHandler 完成后回调
         */
        NSURLSessionDownloadTask * downloadTask = [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 AFN内部会自动完成剪切路径的处理 从临时路径到指定的路径
            NSString * fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
            NSLog(@"fullPath = %@",fullPath);
            NSLog(@"targetPath = %@",targetPath);
            
            return [NSURL fileURLWithPath:fullPath];
        } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
            
            //filePath 文件路径 == destination 回调的返回值
            NSLog(@"filePath -- %@",filePath);
        }];
        
        // 4 执行下载任务
        [downloadTask resume];
    }
    
    

    文件上传

    - (void)upload{
        
        // 1 创建会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        NSDictionary *dic = @{
                              @"username":@"123abc",
                              };
        
        /* 参数说明
         * 第一个参数:请求路径string
         * 第二个参数:非文件参数
         * 第三个参数:constructingBodyWithBlock 处理要上传的文件参数信息
         * 第四个参数:progress 上传进度
         * 第五个参数:success 成功后回调
                    responseObject 响应体信息 (内部已经完成了对JSON的解析)
         * 第六个参数:failure 失败后回调
         */
        [manager POST:@"http://120.25.226.186:32812/upload" parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            
            NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/a58/Desktop/123.png"];
            
            //处理要上传的文件
            
            // 第一种方式 处理要上传的文件
            /* 参数说明
             *
             * 第一个参数:要上传的文件的二进制数据
             * 第二个参数:具体参数值 file
             * 第三个参数:文件名称
             * 第四个参数:文件的二进制数据类型
             */
    //        [formData appendPartWithFileData:imageData name:@"file" fileName:@"123.png" mimeType:@"image/png"];
            
            // 第二种方式 处理要上传的文件
    //        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/a58/Desktop/123.png"] name:@"file" fileName:@"123.png" mimeType:@"image/png" error:nil];
            
            // 第三种方式 处理要上传的文件
            [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/a58/Desktop/123.png"] name:@"file" error:nil];
            
            // AFN 内部会处理 fileName 和 mimeType
            /*
            NSParameterAssert(fileURL);
            NSParameterAssert(name);
            
            NSString *fileName = [fileURL lastPathComponent];
            NSString *mimeType = AFContentTypeForPathExtension([fileURL pathExtension]);
            
            return [self appendPartWithFileURL:fileURL name:name fileName:fileName mimeType:mimeType error:error];
            */
            
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            //监听进度
            NSLog(@"---- %f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"success --- responseObject -- %@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@" failure --- error -- %@",error);
        }];
    }
    

    监听网络状态

    - (void)netChange{
        
        // 1 创建网络监听对象
        AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
        
        // 2 监听
        [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
            
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                    NSLog(@"未知");
                    break;
                case AFNetworkReachabilityStatusNotReachable:
                    NSLog(@"无网络");
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    NSLog(@"蜂窝网络");
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    NSLog(@"WIFI");
                    break;
    
                default:
                    break;
            }
        }];
        
        // 3 开始监听
        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    }
    

    序列化处理

    //既不是json格式 也不是xml格式
    - (void)httpData{
        // 1 创建会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        //内部 内部已经默认对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
        //如果返回的数据既不是JSON格式 也不是XML格式 需要修改manager对响应的解析方式 为 AFHTTPResponseSerializer
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        
        /*
         01 如果返回的数据是json格式  不需要处理
         02 如果返回的数据是xml格式                  manager.responseSerializer = [AFXMLParserResponseSerializer serializer]
         03 如果返回的数据既不是json格式 也不是xml格式  manager.responseSerializer = [AFHTTPResponseSerializer serializer]
         */
        
        
        //2 发送请求
        [manager GET:@"http://baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"responseObject --%@",responseObject);
            NSLog(@"httpData --- %@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"error --%@",error);
        }];
    }
    
    - (void)xml{
        // 1 创建会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        //内部 内部已经默认对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
        //如果返回的数据为XML类型 需要修改manager对响应的解析方式 为 AFXMLParserResponseSerializer
        manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
        //2 发送请求
        //http://120.25.226.186:32812/video
        [manager GET:@"http://120.25.226.186:32812/video" parameters:@{@"type":@"XML"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"responseObject --%@",responseObject);
            
            //使用NSXMLParser 解析数据
           
            // 01 创建解析器
            NSXMLParser *parse = (NSXMLParser *)responseObject;
            
            // 02 设置代理
            parse.delegate = (id<NSXMLParserDelegate>)self;
            // 03 开始解析
            [parse parse];
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"error --%@",error);
        }];
    }
    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{
    }
    
    - (void)json{
        // 1 创建会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        //内部 内部已经默认对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
        //发送请求
        [manager GET:@"http://120.25.226.186:32812/video" parameters:@{@"type":@"JSON"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"responseObject --%@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"error --%@",error);
        }];
    }
    #pragma mark ------------
    
    

    xml 处理结果log

    2018-04-08 18:04:41.000926+0800 AFN基本使用(GET&POST&上传&下载)[2808:196985] responseObject --<3c68746d 6c3e0a3c 6d657461 20687474 702d6571 7569763d 22726566 72657368 2220636f 6e74656e 743d2230 3b75726c 3d687474 703a2f2f 7777772e 62616964 752e636f 6d2f223e 0a3c2f68 746d6c3e 0a>
    2018-04-08 18:04:41.001048+0800 AFN基本使用(GET&POST&上传&下载)[2808:196985] httpData --- <html>
    <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
    </html>
    

    相关文章

      网友评论

          本文标题:AFN 基本使用

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