美文网首页
AFNetworking

AFNetworking

作者: weyan | 来源:发表于2020-03-07 16:15 被阅读0次

一、AFN的GET和POST请求

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self post];
}

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

-(void)post
{
    //01 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    NSDictionary *dict = @{
                           @"username":@"520it",
                           @"pwd":@"520",
                           @"type":@"JSON"
                           };
    
    //02 发送GET请求
    /* 参数说明
     *
     * 第一个参数:请求路径(NSString) 不包含参数
     * http://120.25.226.186:32812/login
     * 第二个参数:字典(存放参数)
     * 第三个参数:progress进度回调
     * 第四个参数:success成功回调
     *          task:请求任务,可以通过task来拿到响应头信息
     *          responseObject:响应体,AFN内部默认对服务器返回的数据进行JSON解析
     * 第五个参数:failure失败回调
     */
    [manager POST:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //responseObject 内部已经完成了JSON解析工作,本身就是OC对象
        NSLog(@"请求成功---%@--%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败---%@",error);
    }];
}
@end

二、AFN的"下载+上传+响应体的几种解析方式+网络状态监听"

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()<NSXMLParserDelegate>

@end

@implementation ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self httpData];
}

-(void)post
{
    //01 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //02 发送请求 (注意参数不能直接跟在url后面)
    //http://120.25.226.186:32812/login?username=&pwd=&type=JSON
    NSDictionary *dict = @{
                           @"username":@"520it",
                           @"pwd":@"520it",
                           @"type":@"JSON"
                           };
    
    [manager POST:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"success--%@",responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"failure--%@",error);
    }];
    
}

-(void)download
{
    //01 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //02 创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://e.hiphotos.baidu.com/image/pic/item/908fa0ec08fa513d72ad82da3f6d55fbb2fbd9ab.jpg"]];
    
    //03 创建下载请求任务 
    /* 参数说明
     *
     * 第一个参数:请求对象
     * 第二个参数: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,内部会自动的完成剪切处理
        NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
        
        NSLog(@"%@",targetPath);
        NSLog(@"%@",fullPath);
        
        return [NSURL fileURLWithPath:fullPath];
        
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        
        //filePath 文件路径 ==destination回调的返回值
        NSLog(@"filePath---%@",filePath);
    }];
    
    //04 执行下载任务
    [downloadTask resume];
}

-(void)upload
{
    //01 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    NSDictionary *dict = @{
                           @"username":@"abcdef"
                           };
    //02 发送请求上传
    /* 参数说明
     *
     * 第一个参数:请求路径String
     * 第二个参数:非文件参数
     * 第三个参数:constructingBodyWithBlock 处理要上传的文件参数的
     * 第四个参数:progress进度回调
     * 第五个参数:success成功后的回调
     *          responseObject 响应体信息(内部已经完成了JSON解析)
     * 第六个参数:失败后的回调
     */
    [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        
        //文件上传的第一种方法
        //NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/Snip20161127_246.png"];
        
        //处理要上传的文件
        /* 参数说明
         *
         * 第一个参数:要上传文件的二进制数据
         * 第二个参数:具体参数值  file
         * 第三个参数:文件的名称
         * 第四个参数:文件的二进制数据类型
         */
        //[formData appendPartWithFileData:imageData name:@"file" fileName:@"123.png" mimeType:@"image/png"];
        
        //第二种方式
        //[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/Snip20161127_246.png"] name:@"file" fileName:@"1234.png" mimeType:@"image/png" error:nil];
        //第三种方式
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/Snip20161127_246.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(@"success--%@",responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error---%@",error);
    }];
}

-(void)JSON
{
    //01 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
    //02 发送请求
    //http://120.25.226.186:32812/video?type=JSON
    
    [manager GET:@"http://120.25.226.186:32812/video" parameters:@{@"type":@"JSON"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"success--%@",responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error-%@",error);
    }];
}


-(void)xml
{
    //01 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
    //如果返回的数据是XML类型:那么需要调整manager对响应的解析方式为:AFXMLParserResponseSerializer
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    //02 发送请求
    [manager GET:@"http://120.25.226.186:32812/video" parameters:@{@"type":@"XML"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success--%@",responseObject);
        //使用NSXMLparser解析数据
        //01 创建解析器
        NSXMLParser *parser = (NSXMLParser *)responseObject;
        
        //02 设置代理
        parser.delegate = self;
        
        //03 开始解析
        [parser parse];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error-%@",error);
    }];
}

//上传文件数据
-(void)httpData
{
    //01 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
    //如果返回的数据是XML类型:那么需要调整manager对响应的解析方式为:AFXMLParserResponseSerializer
    //如果返回的数据既不是JSON也不是XML:AFHTTPResponseSerializer
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    /*
     (1)如果返回的是JSON:不需要处理,默认就是JSON解析
     (2)如果返回的是XML:       manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
     (3)如果不是XML也不是JSON: manager.responseSerializer = [AFHTTPResponseSerializer serializer];
     */
    
    [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success--%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error-%@",error);
    }];
}

//网络状态监听
-(void)change
{
    //01 创建网络监听管理者对象
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    
    //02 监听
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
       
        //当监听到网络状态改变的时候就会调用该block,并且把当前的网络状态作为参数传给block
        /*
         AFNetworkReachabilityStatusUnknown          = -1,
         AFNetworkReachabilityStatusNotReachable     = 0,
         AFNetworkReachabilityStatusReachableViaWWAN = 1,
         AFNetworkReachabilityStatusReachableViaWiFi = 2,
         */
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"网络状态未知");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没有网络");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"蜂窝网络 3G|4G");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                break;
                
            default:
                break;
        }
    }];
    
    //03 开始监听
    [manager startMonitoring];
}

#pragma mark -----------------------
#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);
}

@end

相关文章

网友评论

      本文标题:AFNetworking

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