AFN 基本使用

  • 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  _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)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 *)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 --- 


你可能感兴趣的:(AFN 基本使用)