AFNetworking是一个 在iOS开发中 使用非常多网络开源库.它是一个轻量级的网络请求API类库.

适用于iOS以及Mac OS X。它构建于在(Apple iOS开发文档) NSURLConnection ,  NSOperation , 以及其他熟悉的Foundation技术之上。

下面的类已从AFNetworking 3.0中废弃:

  • AFURLConnectionOperation
  • AFHTTPRequestOperation
  • AFHTTPRequestOperationManager

现在核心代码:AFHTTPSessionManager,<AFNrtworking3.1.0目前使用NSURLSession作为网络类!!!!>

它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。

官方链接http://cocoadocs.org/docsets/AFNetworking/1.3.0/

重要功能梳理:

  • AFURLConnectionOperation :继承自 NSOperation 实现了NSURLConnection 的代理方法.
  • AFHTTPRequestOperation :   继承自   AFURLConnectionOperation的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用于 决定request是否成功的状态码和内容类型.
  • AFJSONRequestOperation :  继承自AFHTTPRequestOperation,用于下载和处理json response数据.
  • AFXMLRequestOperation : 继承自 AFHTTPRequestOperation,用于下载和处理xml response数据.
  • AFPropertyListRequestOperation : 继承自 AFHTTPRequestOperation,用于下载和处理 property list  response数据.
  • AFHTTPClient :是一个封装了基于http协议的网络应用程序的公共交流模式.包含
    1.发起 基于根路径的使用基本的url相关路径来只做request
    2.为request自动添加设置http headers.
    3.使用http 基础证书或者OAuth来验证request
    4.为由client制作的requests管理一个NSOperationQueue
    5.从NSDictionary生成一个查询字符串或http bodies.
    6.从request中构建多部件
    7.自动的解析http response数据为相应的表现数据
    8.在网络可达性测试用监控和响应变化.

下面我们就来看看AFNetworking的基本使用:

  1. #pragma mark - 网络监测按钮的响应方法
  2. - (IBAction)networkingMonitoringAction:(id)sender {
  3. //isOpen是自己定义的一个Bool值的属性,来切换开关网络检测这一功能.
  4. if (!self.isOpen) {
  5. //打开网络监测
  6. [[AFNetworkReachabilityManager sharedManager] startMonitoring];
  7. self.isOpen = YES;
  8. } else {
  9. //关闭网络监测
  10. [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
  11. self.isOpen = NO;
  12. }
  13. //接下来判断当前网络状态:wifi,2G/3G/4G,无网络访问
  14. [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  15. switch (status) {
  16. case AFNetworkReachabilityStatusUnknown:
  17. NSLog(@"当前网络未知");
  18. break;
  19. case AFNetworkReachabilityStatusNotReachable:
  20. NSLog(@"当前无网络访问");
  21. break;
  22. case AFNetworkReachabilityStatusReachableViaWWAN:
  23. NSLog(@"当前手机流量网络");
  24. break;
  25. case AFNetworkReachabilityStatusReachableViaWiFi:
  26. NSLog(@"当前wifi连接网络");
  27. break;
  28.  
  29. default:
  30. break;
  31. }
  32. }];
  33. }

网络状态检测

//初始化session对象
    self.session = [AFHTTPSessionManager manager];
    //设置请求接口回来的时候支持什么类型的数据
//    self.session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html", nil];    (之前忘了,现在添加上)

这一步必不可少,必须写明要获取数据的类型,不然会报错.

下面我们来看看怎么实现数据请求:

  1. #pragma mark - GET请求
  2. - (IBAction)getRequestAction:(id)sender {
  3.  
  4. //参数一:get请求的网址
  5. //参数二:拼接参数body
  6. //参数三:progress表示进度的意思
  7. //参数四:数据请求成功后执行的操作
  8. //参数五:请求失败后报的错误
  9. [self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
  10. NSLog(@"下载的进度");
  11. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  12. NSLog(@"请求成功%@", responseObject);
  13. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  14. NSLog(@"请求失败%@", error);
  15. }];
  16. }
  17.  
  18. #pragma mark - post请求
  19. - (IBAction)postRequestAction:(id)sender {
  20. /*
  21. body: {
  22. do = "pri_memberlist";
  23. "member_id" = zpHr2dsRvQQxYJxo2;
  24. "workspace_id" = ILfYpE4Dhs2gWcuQx;
  25. }*/
  26. NSString *url = @"http://m.taskwedo.com/API/wedo1/wedo.php";
  27.  
  28. //一般的body都是给你一个字典类型的,需要你创建一个字典来接受存储
  29. NSMutableDictionary *dic = [NSMutableDictionary dictionary];
  30. [dic setValue:@"pri_memberlist" forKey:@"do"];
  31. [dic setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
  32. [dic setValue:@"ILfYpE4Dhs2gWcuQx" forKey:@"workspace_id"];
  33.  
  34. [self.session POST:url parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
  35. NSLog(@"上传进度");
  36. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  37. NSLog(@"请求成功%@", responseObject);
  38. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  39. NSLog(@"失败啦,哈哈%@", error);
  40. }];
  41.  
  42. }
  43.  
  44. #pragma mark - post请求2(当body中含有汉字或特殊字符的时候,这时候需要转码)
  45. - (IBAction)postTwoRequestAction:(id)sender {
  46. /* BODY: address = "";
  47. comment = "\U7c7b\U6a21\U5757\U8ba1\U5212\U7528\U5230\U7b2c\U4e09\U90e8\U5206\U4e2d\Uff0c\U5f85\U63d0\U95ee\U3001\U56de\U7b54\U79ef\U7d2f\U5230\U4e00\U5b9a\U6570\U91cf\U65f6\Uff0c\U4fbf\U4e8e\U5927\U5bb6\U7684\U95ee\U9898\U7684\U5feb\U901f\U67e5\U627e\Uff0c\U6240\U4ee5\U63d0\U95ee\U90e8\U5206\U6682\U65f6\U4e0d\U52a0\U5165\U8fd9\U4e2a";
  48. do = "add_comment";
  49. kind = task;
  50. "member_id" = zpHr2dsRvQQxYJxo2;
  51. other = "";
  52. "task_id" = 55a47e79ec25e3641;*/
  53.  
  54. NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
  55.  
  56. NSString *comment = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个";
  57. //对汉字进行转码操作
  58. comment = [comment stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  59.  
  60. NSMutableDictionary *dic = [NSMutableDictionary dictionary];
  61. [dic setValue:@"" forKey:@"address"];
  62. [dic setValue:comment forKey:@"comment"];
  63. [dic setValue:@"add_comment" forKey:@"do"];
  64. [dic setValue:@"task" forKey:@"kind"];
  65. [dic setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
  66. [dic setValue:@"" forKey:@"other"];
  67. [dic setValue:@"55a47e79ec25e3641" forKey:@"task_id"];
  68.  
  69. //请求报文
  70. [self.session POST:urlStr parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
  71. NSLog(@"上传进程%@", uploadProgress);
  72. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  73. NSLog(@"请求成功%@", responseObject);
  74. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  75. NSLog(@"请求失败%@", error);
  76. }];
  77.  
  78. //可以看到,在第三方库中,我们直接就可以调用GET和POST请求方法,不用像以前一样,写那么多行代码了,大大简化了代码量
  79. }

GET和POST数据请求

注意:AFNetworking可以进行JSON数据解析/Plist数据解析.(不支持XML数据解析)
URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

第三方库AFNetworking 3.1.0的简单使用的更多相关文章

  1. ios开发之--使用AFNetWorking 3.1.0 ,简单的请求封装类

    从苹果系统自带的请求类,到ASIHttpRequest第三方请求类,再到AFNetWorking第三方请求类,目前只要牵扯到数据请求,基本上都是用AFN,所以,这里纯粹是记录下: hRequestTo ...

  2. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  3. swift 中使用OC第三方库(以AFNetworking为例)

    首先呢  把你需要的第三方库导入到你的项目中来  具体怎么导入 这不是这篇的重点  看上一篇 废话不多  直接上 (1)在项目中直接建一个 oc 的控制器  然后xcode会提醒你  要不要建造桥接文 ...

  4. python第三方库requests简单介绍

    一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...

  5. python - 实现文本分类[简单使用第三方库完成]

    第三方库 pandas sklearn 数据集 来自于达观杯 训练:train.txt 测试:test.txt 概述 TF-IDF 模型提取特征值建立逻辑回归模型 代码 # _*_ coding:ut ...

  6. Android 使用Retrofit2.0+OkHttp3.0实现缓存处理+Cookie持久化第三方库

    1.Retrofit+OkHttp的缓存机制 1.1.第一点 在响应请求之后在 data/data/<包名>/cache 下建立一个response 文件夹,保存缓存数据. 1.2.第二点 ...

  7. Android MultiType第三方库的基本使用和案例+DiffUtil的简单用法

    1.MultiType简单介绍 1.1.MultiType用于比较复杂的页面. 如下图,今日头条用到了MultiType处理各种复杂的页面.    这种还是比较简单的类型.因为一个页面也就这种类型. ...

  8. FreeSWITCH第三方库(其他)的简单介绍(三)

    FreeSWITCH使用了大量的第三方库,本文档主要介绍关联相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 视频相关 ...

  9. NDK中android.mk文件的简单介绍和第三方库的调用

    先贴一个样例,然后解释一下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mydjvuapi SRC_FILE_ ...

随机推荐

  1. Myeclipse SVN 修改用户名和密码

    转自:http://blog.csdn.net/chow__zh/article/details/7731497 解决方案: 在Eclipse使用SVN的过程中大多数人往往习惯把访问SVN的用户名密码 ...

  2. 关键词匹配(Ac自动机模板题)

    2772: 关键词匹配 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 4[Submit][Status][Web Board] ...

  3. Python 线程池的实现

    import urllib2 import time import socket from datetime import datetime from thread_pool import * def ...

  4. add jars和add external jars有什么区别

    原文add jars和add external jars有什么区别?   add jars和add external jars有什么区别?   add external jars  = 增加工程外部的 ...

  5. wukong搜索引擎源码解读

    转自:https://ayende.com/blog/171745/code-reading-wukong-full-text-search-engine I like reading code, a ...

  6. PHP 一致性哈希算法的一种简单实现

    在分布式系统中,如果某业务可以由多个相同的节点处理,很容易想到用HASH的方式将业务请求分散到这些节点处理,比如memecache缓存等分 布式集群应用,如果只是简单的使用,不涉及用户用户状态等信息, ...

  7. 二叉树最大路径和-Binary Tree Maximum Path Sum

    Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...

  8. permutation test

  9. js原生:封装document.getElementByClassName()函数

    //接口封装:封装document.getElementByClassName()函数function getElementsByClassName (cName,domTag,root) {//该函 ...

  10. Linux下的文件目录结构详解

    Linux下的文件目录结构详解 / Linux文件系统的上层根目录 /bin 存放用户可执行的程序 /boot 操作系统启动时所需要的文件 /dev 接口设备文件目录,例如:had表示硬盘 /etc ...