AFNetworking使用详解
导语:
众所周知,AFNetworking是目前IOS开发中非常受欢迎的第三方网络通信类库,同时AFNetworking对苹果官方NSURLConnection和NSURLSession进行了封装,使用起来可以说是简单的"令人发指".
官网地址:
AFNetworking有关请求与响应的信息
请求:(序列化)
AFURLRequestSerialization
AFHTTPRequestSerializer(默认) 传输的就是二进制
AFJSONRequestSerializer 传输入的二进制是一个JSON格式的二进制 ,只有NSArray,NSDictionay
AFPropertyListRequestSerializer 传输的到时候是一个plist,这个不玩意儿不用,因为他不通用
响应:(反序列化)
<AFURLResponseSerialization>
AFHTTPResponseSerializer //返回的就一个纯洁的二进制
AFJSONResponseSerializer(默认) 返回的是一个JSON格式的二进制,并且AFN帮我们自动序列化成了字典或是数组
AFXMLParserResponseSerializer XMLParser
AFXMLDocumentResponseSerializer (Mac OS X) 不适合我们的iOS
AFPropertyListResponseSerializer plist
AFImageResponseSerializer //国片
AFCompoundResponseSerializer //混合
使用AFNetworking
- GET方法:
//1.首先创建一个管理者
AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];
//2.发送请求
//在使用AFN的时候,直接传递我们url的字符串就可以了
//AFN在反序列化的时候,默认是帮我们按照JSON的格式去解析
[manager GET:@"http://localhost/test.json" parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
//第一个参数 operation 操作
//第二个参数 responseObject
NSLog(@"%@---%@",responseObject,[responseObject class]);
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
- POST方法:
//1.创建一个基于NSURLConnection的管理
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//2.发送我们的POST请求
//用户名密码
NSDictionary *param = @{@"username":@"admin",@"password":@"123"};
//登陆到得网址
[manager POST:@"http://localhost/login.php" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
NSLog(@"post result====%@---%@",responseObject,[responseObject class]);
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
- AFNetworking之搭配webView使用
注意:因为默认情况下AFNetworking的响应解析方式都是按照JOSN解析,所以我们需要修改AFNetworking的解析方式,但是为了以后使用方便,我们不在AFNetworking基础上修改,我们添加一个类继承自AFHTTPSessionManager然后创建一个单例,这样以后AFNetworking更新,我们的代码也不会因此受到影响.
首先创建NetWorkTool类,并创建单例方法
#import "AFHTTPSessionManager.h"
@interface NetWorkTool : AFHTTPSessionManager
//单例
+ (instancetype)sharedNetWorkTool;
@end
实现单例方法
#import "NetWorkTool.h"
@implementation NetWorkTool
static NetWorkTool *_instance;
+ (instancetype)sharedNetWorkTool{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[NetWorkTool alloc] initWithBaseURL:nil];
_instance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];
//默认情况下的响应解析方式,就是不管服务器给我们返回的是什么,都按照JSON去解析
//将默认的JSON序列化方式,改成我们最普通的二进制
_instance.responseSerializer = [AFHTTPResponseSerializer serializer];
});
return _instance;
}
@end
在控制器中拖入一个UIWebView试图,通过连线方式连接到控制器中
#import "ViewController.h"
#import "NetWorkTool.h"
@interface ViewController ()
//WebView
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self loadWebView];
}
- (void)loadWebView{
//1.获取我们NetWorkTool的单例
NetWorkTool *netWorkTool = [NetWorkTool sharedNetWorkTool];
//2.发送GET请求 //html
__weak typeof(self) weakSelf = self;
[netWorkTool GET:@"http://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"result===%@----%@",responseObject,[NSThread currentThread]);
//再将我们返回的二进制,转成我们字符串,反序列化
NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
//在主线程更新UI
[weakSelf.webView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://www.baidu.com"]];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error===%@",[error localizedDescription]);
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
- AFNetworking之联网检测
联网检测对应状态
AFNetworkReachabilityStatusUnknown = -1, //未知的状态
AFNetworkReachabilityStatusNotReachable = 0, //不能联网
AFNetworkReachabilityStatusReachableViaWWAN = 1, //流量
AFNetworkReachabilityStatusReachableViaWiFi = 2, //wifi
//点击屏幕的时候开始检测
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%ld",status);
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
- AFNetworking之上传文件
//点击屏幕的时候上传文件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//获取基于NSURLSession的管理器
AFHTTPSessionManager *manager=[AFHTTPSessionManager manager];
//上传文件
NSDictionary *param=@{@"status":@"this is test"};
[manager POST:@"http://localhost/post/upload-m.php" parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//获取文件1
NSURL *url1=[[NSBundle mainBundle]URLForResource:@"01.jpg" withExtension:nil];
[formData appendPartWithFileURL:url1 name:@"userfile[]" fileName:@"01.jpg" mimeType:@"image/png" error:NULL];
//获取文件2
NSURL *url2=[[NSBundle mainBundle]URLForResource:@"02.jpg" withExtension:nil];
NSData *data2=[NSData dataWithContentsOfURL:url2];
//[formData appendPartWithFileData:data2 name:@"userfile[]" fileName:@"02.jpg" mimeType:@"image/png"];
//application/octet-stream通用格式
[formData appendPartWithFileData:data2 name:@"userfile[]" fileName:@"02.jpg" mimeType:@"application/octet-stream"];
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"responseObject--->%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error---->%@",error);
}];
}
我的简书: http://www.jianshu.com/users/666b623d4bf1/latest_articles
AFNetworking使用详解的更多相关文章
- AFNetworking 用法详解
之前一直使用ASIHttpRequest 做网络请求 ,后来新公司用AFNetWorking ,经过一段时间学习总结一下二者的优缺点: 1.AFNetWorking的优缺点 优点: 1.维护和使用者比 ...
- AFNetworking 内部详解
AFNetworking 是一个适用于IOS 和 Mac OSX 两个平台的网络库,他是在Foundation URL Loading System 基础上进行的一套封装 ,并提供了丰富的API接口 ...
- AFNetworking 与 UIKit+AFNetworking 详解
资料来源 : http://github.ibireme.com/github/list/ios GitHub : 链接地址 简介 : A delightful iOS and OS X networ ...
- AFNetworking 3.0 使用详解 和 源码解析实现原理
AFN原理&& AFN如何使用RunLoop来实现的: 让你介绍一下AFN源码的理解,首先要说说封装里面主要做了那些重要的事情,有那些重要的类(XY题) 一.AFN的实现步骤: NSS ...
- iOS开发——网络编程Swift篇&Alamofire详解
Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...
- ios新特征 ARC详解
IOS ARC 分类: IOS ARC2013-01-17 09:16 2069人阅读 评论(0) 收藏 举报 目录(?)[+] 关闭工程的ARC(Automatic Reference Co ...
- Podfile文件用法详解
https://www.jianshu.com/p/b8b889610b7e 2018.01.09 15:51* 字数 2343 阅读 6263评论 3喜欢 34 前言 iOS开发会经常用到cocoa ...
- CocoaPods详解之(二)----进阶篇
CocoaPods详解之----进阶篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/19178709 转载请注明出处 ...
- CocoaPods详解之(一)----使用篇
CocoaPods详解之----使用篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 一.什么是Coc ...
随机推荐
- AsyncCalls – Asynchronous function calls
AsyncCalls – Asynchronous function callsWith AsyncCalls you can execute multiple functions at the sa ...
- 在 C++Builder 工程里使用 Visual C++ DLL(3个工具) good
译者序: 第一次读这篇文章是在 2001 年 10 月,帮我解决了一点小问题.本来不好意思翻译,因为英语水平实在太差.最近发现不少网友在问在 C++Builder 的工程里调用 Visual C++ ...
- DB2 replace into实现
最近进入到另一个项目, 数据库用的是DB2, 要实现MySQL中类似replace into的功能, 网上搜了下, 实现了一个类似功能的基础方法(PHP实现) public function repl ...
- Squares(哈希)
Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 14328 Accepted: 5393 Description A sq ...
- Luogu 考前模拟Round. 1
A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...
- 【宽搜】Vijos P1360 八数码问题
题目链接: https://vijos.org/p/1360 题目大意: 3x3格子上放1~8数字,一个空位,每次空位可与上下左右交换,固定终止布局,求输入的起始布局需要几步到达终止布局 题目思路: ...
- 高效算法——E - 贪心-- 区间覆盖
E - 贪心-- 区间覆盖 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 解题思路: 贪心思想, ...
- web前端开发中Nodejs、Grunt、npm等的介绍、使用
一.Nodejs的安装: Grunt和所有grunt插件都是基于nodejs来运行的,如果你的电脑上没有nodejs,就去安装吧.去 https://nodejs.org/ 上,点击页面中那个绿色.大 ...
- hdu4696 想法题
就像1.2元人民币可以凑成任意你想要的面值一样.由于一定会有环,只要有C[i] == 1 就可以造成任何数.够坑吧 #include <cstdio> #include <cstri ...
- centos 7 安装 mariadb数据库
1.安装MariaDB #安装命令yum install mariadb mariadb-server -y#安装完成MariaDB,首先启动MariaDBsystemctl start mariad ...