在这一系列的文章中,我会对AFNetworking的源代码进行分析,了解其的构建过程,如何在日程中完成发送HTTP请求,构建网络层这一任务.
概述:
AFN整体架构如下:
在这篇文章中,有两个问题需要了解:
1,如何使用NSURLSession发出HTTP请求;
2.如何使用AFNetworking 发出HTTP请求
NSURLSession
NSURLSession 以及他相关的类为我们提供下载内容的API,这个API提供了一系列的代理方法 来支持身份认证,并且支持后台下载.
使用NSURLSession 来进行HTTP请求并且获得数据总共有5个步骤:
1.实例化一个NSURLRequest/NSMutableURLRequest,设置 URL
2.通过-shareSession 方法调取NSURLSession
3.在session上调用- dataTaskWithRequest:completionHandler:方法返回一个NSURLSessionDataTask,将请求加入队列
4. 向data task 发送消息 -resume ,开始执行这个队列任务
5. 在completionHandler 中将数据编码,返回字符串
NSMutableURLRequest*request = [[NSMutableURLRequestalloc]initWithURL:[[NSURLalloc]initWithString:@"https://github.com"]];
NSURLSession*session = [NSURLSessionsharedSession];
NSURLSessionDataTask*task = [sessiondataTaskWithRequest:requestcompletionHandler:^(NSData* _Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable error) {NSString*dataStr = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];NSLog(@"%@", dataStr); }];
[taskresume];
这一段代码可以说是使用NSURLSession发送请求最简单的一段代码.
AFNetworking
AFNetworking 的使用也是比较简单,使用它来发出HTTP请求有两个步骤
1.在服务器的主机地址或者域名生成一个 AFHTTPSessionManager 的实例
2.调用- GET:parameters:progress:success:failure:方法
AFHTTPSessionManager *manager = [[AFHTTPSessionManageralloc]initWithBaseURL:[[NSURLalloc]initWithString:@"hostname"]];[managerGET:@"relative_url"parameters:nilprogress:nilsuccess:^(NSURLSessionDataTask* _Nonnull task,id_Nullable responseObject) {NSLog(@"%@",responseObject); }failure:^(NSURLSessionDataTask* _Nullable task,NSError* _Nonnull error) {NSLog(@"%@", error); }];
注意:在iOS9下,苹果默认全局HTTPs,如果你要发送不安全的HTTP请求,需要在info.plist加入键值对才能发出不安全的HTTP请求
同时需要注意:AFNetworking默认接收son格式的响应,如何想要返回html,需要设置acceptableContentTypes
AFNetworking的调用栈
这一节主要分析一下,在上面两个方法的调用栈,首先来看AFHTTPSessionManager的初始化方法
- [AFHTTPSessionManager initWithBaseURL:]
- [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]
- [AFURLSessionManager initWithSessionConfiguration:]
- [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]
- [AFJSONResponse Serializerserializer]// 负责序列化响应
- [AFSecurityPolicy defaultPolicy]// 负责身份认证
- [AFNetworkReachability ManagersharedManager]// 查看网络连接情况
- [AFHTTPRequestSerializer serializer]// 负责序列化请求
- [AFJSONResponseSerializer serializer]// 负责序列化响应
从这个初始化方法的调用栈,我们可以非常清晰地看清楚这个框架的结构
1.其中AFURLSessionManager 是AFHTTPSessionManager的父类
2.AFURLSessionManager 负责生成NSURLSession的实例,管理AFSecurity 和 AFNetworkReachabilityManager ,来保证请求的安全和查看网络连接情况,它有一个AFJSONResponseSerializer 来序列化HTTP响应
3.AFHTTPSessionManager 有着自己的AFHTTPRequestSerializer 和 AFJSONRequestSerializer来管理请求和响应的序列化,同时依赖父类提供的接口保证安全,监控网络状态,实现发出HTTP请求这一核心功能
小结:
AFNetworking 实际上只是对NSURLSession 高度地封装.提供一些简单易用的API方便在开发中发出网络请求并在其上更快地构建网络层组件并提供合理的接口.
随后,在以后的几篇文章中,会详细介绍AFNetworking是如何工作的,并且如何进行合理地组织到一起的.