iOS基础-AFNetWorking的简单总结

别来沧海事,语罢暮天钟<莲叶童子>

AFNetWorking:

  • AFNetworking是一个 在iOS开发中使用非常多的网络开源库
  • 是用于iOS以及Mac OS X . 构建于在(Apple iOS开发文档)NSURLConnection, NSOperation, 以及其他熟悉的Foundation技术之上.
  • 他拥有良好的架构, 丰富的api, 以及模块化构建方式, 使得使用起来非常轻松
    官方链接

使用AFNetworking进行网络判断
使用AFNetworking进行GET和POST请求

1、AFNetworking是一个轻量级的iOS网络通信类库。

2、它建立在NSURLConnection和NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单。

3、它支持HTTP请求和基于REST的网络服务(包括GET、POST、 PUT、DELETE等)。

4、支持ARC。

  • 开始设计 AFNetWorking 思路

AFNetworking是基于NSURLConnection和NSOperation的
1: NSURLConnection是处理网络连接的。
2: NSOperation是管理NSURLConnection的,可以监视一个请求的生命周期。

  • NSOperation相关类 (AFNetWorking比较关键的类)

1: AFURLConnectionOperation:NSOperation的子类,实现了NSURLConnection 的代理方法。将网络请求依附到一个operation上。从而让我们能够有效的控制并观察一个网络请求的创建、进行、取消、完成、暂停恢复、异常等问题及状态

2、AFHTTPRequestOperation:AFURLConnectionOperation的子类,针对request使用的协议为HTTP和HTTPS。它封装的可接受状态码和内容的类型,判定一个请求结果是成功或失败

3、AFHTTPRequestOperationManager:(核心类) 封装了一组调用请求的方法---封装完成了一种通用的模式,可以帮助我们完成请求的创建、响应的系列化,网络状态的监控以及安全策略以及每一个请求operation的管理

  • iOS7.0之后AFNetWorking进一步完善的类

1: AFURLSessionManager:创建、管理基于 NSURLSessionConfiguration 对象的 NSURLSession 对象的类,也可以管理 session 的数据、下载/上传任务,实现 session 和其相关联的任务的 delegate 方法。

2、AFHTTPSessionManager:封装了一组调用请求的方法。

  • AFNetworking针对请求和响应的序列化进行的单独的封装

1、AFURLRequestSerialization:合这个协议的对象用于处理请求,它将请求参数转换为 query string 或是 entity body 的形式,并设置必要的 header。

2、AFURLResponseSerialization:符合这个协议的对象用于验证、序列化响应及相关数据,转换为有用的形式,比如 JSON 对象、图像、甚至基于 Mantle 的模型对象。

  • AFNetworking可以检测当前网络的可达性。

1: AFNetworkReachabilityManager:这个类监控当前网络的可达性网络的连通状态监控以及网络的类型。,提供回调 block 和 notificaiton,在可达性变化时调用。实际是将苹果官方提供的Reachability的类名和通知名更换了一下,防止和系统提供的类的通知名以及类名的冲突。

  • AFNetworking提供了请求的安全策略。

1、AFSecurityPolicy:评估服务器对安全连接针对指定的固定证书或公共密钥的信任。将你的服务器证书添加到 app bundle,以帮助防止 中间人攻击。

  • 两个重要的协议
  • AFURLRequestSerialization
    1:符合这个协议的对象用于处理请求,它将请求参数转换为 query string 或是 entity body 的形式,并设置必要的 header。
    2:构建multipart请求。
  • AFURLResponseSerialization
    遵循AFURLResponseSerialization协议的对象,用于验证、序列化响应及相关数据,转换为有用的形式,比如 JSON 对象、图像、甚至基于mantle的模型对象。
这个我也用的不太熟练,搜集了一些基础知识供大家参考, 下面几个简单的代码例子,欢迎大家指正
#pragma mark -------- GET 请求 ------------
- (void)get
{
// 创建请求 Manager 对象
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    
  [mgr GET:@"GET_URL" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
       // responseObject 里面, 是请求成功以后返回的字典或者数据, 然后对其进行解析
        NSLog(@"GET 请求成功: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"GET 请求失败: %@ ", error);
    }];
}
#pragma mark -------- POST 请求 --------------
- (void)post
{// 创建请求对象
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager new];
    
// 设置请求参数为 JSON 格式 
    mgr.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置响应序列化为二进制   
  mgr.responseSerializer = [AFJSONResponseSerializer serializer];
    
// 设置一个 Body
    NSDictionary *dic = @{@"date":@"20131129",@"startRecord":@"1",@"len":@"5",@"udid":@"1234567890",@"terminalType":@"Iphone",@"cid":@"213"};   
    [mgr POST:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject){
    
        NSLog(@"POST 请求成功: %@",responseObject);
//        NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
//        NSLog(@"%@",str);
 
} failure:^(AFHTTPRequestOperation *operation, NSError *error){
    NSLog(@"POST 请求失败: %@",error);
}];

#pragma mark -------  下载 ---------
- (void)DownLoad
{
// 创建一个用来分别配置每一个 session 对象的配置类
 //  defaultSessionConfiguration : 是session默认配置, 使用硬盘内存来存储缓存数据
    
    NSURLSessionConfiguration *Configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

// 创建 manager 管理对象
    AFURLSessionManager *mgr = [[AFURLSessionManager alloc] initWithSessionConfiguration:Configuration];

// 下载内容的接口 百度的一张照片
    NSURL *url = [NSURL URLWithString:@"http://a2.att.hudong.com/36/41/01300000281228122578414333627.jpg"];

// 创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 创建下载任务
    NSURLSessionDownloadTask *task = [mgr downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        // block 需要返回值 就是你要存的位置
        NSURL *path = [[NSFileManager defaultManager] URLForDirectory:(NSDocumentDirectory) inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
        // 返回和服务器文件名一样, 当我们希望保存的文件名和服务器的文件名一致的时候, 可以使用这个名字: suggestedFilename
        return [path URLByAppendingPathComponent:[response suggestedFilename]];
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"打印下载的路径: %@",filePath);
    }];

    [task resume];
}
#pragma mark ----------- 文件上传 ---------

- (void)UpLoad
{
// 创建一个用来分别配置每一个 session 对象的类
//  defaultSessionConfiguration : 是session默认配置, 使用硬盘内存来存储缓存数据
    
    NSURLSessionConfiguration *Configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 创建 manager 管理对象
    AFURLSessionManager *mgr = [[AFURLSessionManager alloc] initWithSessionConfiguration:Configuration];
    
    // 将东西上传到的接口
    NSURL *url = [NSURL URLWithString:@""];

// 创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
// 将要上传文件的路径
    NSURL *path = [NSURL fileURLWithPath:@"电脑路径"];

  
//创建任务
    NSURLSessionUploadTask *task = [mgr uploadTaskWithRequest:request fromFile:path progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error)
        {
            NSLog(@"上传失败 ---- %@",error);
        }else
        {
            NSLog(@"上传成功----%@-----%@",response, responseObject);
        }
    }];
   
    [task resume];

}
#pragma mark ---- 网络判断 -------
- (void)reachbility
{
// 创建网络监听管理者对象
    AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
// 设置监听
[mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status)
    {
        
        case AFNetworkReachabilityStatusUnknown:
            NSLog(@"未识别的网路");
            break;
           
        case AFNetworkReachabilityStatusReachableViaWWAN:
            NSLog(@"2G 3G 4G 网络");
            break;
            
        case AFNetworkReachabilityStatusReachableViaWiFi:
            NSLog(@"WIFI");
            break;
        
        case AFNetworkReachabilityStatusNotReachable:
            NSLog(@"不可达的(未连接的)");
            break;
        
        default:
            break;
    }
}];
    
    // 开启监听
    [mgr startMonitoring];
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1、OC中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码。【难度系数★★】 1)创建线程的方法...
    木旁_G阅读 1,938评论 2 16
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • • 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向...
    WSGNSLog阅读 1,227评论 0 1
  • 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e2...
    笔笔请求阅读 535评论 0 0
  • 减肥算是朋友圈里的常见话题了,每次打开一看,要么是老生常谈、新瓶旧酒,要么直接捏住鼻子灌鸡汤,撸起袖子打鸡血,事毕...
    千光一阅读 4,388评论 46 93