AFNetWorking
文章目录
- 原生的网络请求
- NSURLSession
- NSURLSessionTask
- 状态
- 控制任务
- 获取任务信息
- 回调操作
- 检查错误
- 检查状态码和数据
- 处理数据
- 原生网络请求总结
- AFNetworking
- 管理器 AFHTTPSessionManager
- get请求
- Post请求
- 对比AFN和原生的区别
在开始讲解
AFNetWorking
开始之前,我们先来看原生的网络请求是如何进行的
原生的网络请求
在请求之前,我们应该先有一个可以向其请求的网页地址,所以我们需要先拼接一个URL
NSURL
,这个类就是把原生的字符串转换成一个可以被NSURLSession
识别并使用的对象,这样我们就准备好了一个可以使用的URL
NSString* urlStr = [NSString stringWithFormat:@"%@/forecast.json?key=%@&q=%@&aqi=yes&days=10&lang=zh",self.baseURL, self.apiKey,city];
NSLog(@"向%@ 请求数据",urlStr);
NSURL* url = [NSURL URLWithString:urlStr];
NSURLSession
之后使用NSURLSession
来使用,这是一个单例,只能使用share来获取,无需额外的配置
它是整个网络通信的回话管理者,负责创建,管理所有的网络任务
获取到NSURLSession
单例后,使用它的dataWithURL方法来创建一个NSURLSessionDataTask
除了dataWithURL方法,还有几个其他的方法这里简单说明:
- NSURLSessionDataTask:这个就是我们常用的json数据,适用于小数据
- NSURLSessionDownloadTask:这个是接收大文件时常用的
- NSURLSessionUploadTask:顾名思义,上传
这个方法需要接收一个URL
类型和一个回调block
NSURLSessionTask
NSURLSessionTask
来接受这个创建好的任务
// 回调操作
NSURLSessionTask* task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {// 处理数据的操作
}]
tast有不同的状态和操作,同样在这里简单列举
状态
- running:正在运行
- suspended:已暂停
- canceling:正在取消
- completed:已完成
控制任务
- resume:启动或恢复一个暂停的任务,要在写完回调后启动任务
- suspend:暂停一个正在运行的任务
- cancel:取消一个任务
获取任务信息
- taskIdentifer:任务的唯一标识符
- originalRequest:任务的原始请求对象
- response:任务的响应对象
- error:如果任务失败会提供错误信息
回调操作
在刚刚提到的回调block中,有三个参数
- data:数据存放处
- response:响应,HTTP状态码,响应头信息等信息
- error:如果失败,错误的信息
检查错误
先判断是否error为空,若不为空,说明任务出现问题,立刻返回方法
if (error) {NSLog(@"请求失败:%@",error.localizedDescription);return;
}
检查状态码和数据
在任务成功之后,要检查网站返回的状态码和数据,检查状态码是否为200(正常)和数据是否为空
NSHTTPURLResponse* httpResp = (NSHTTPURLResponse* )response;
NSLog(@"状态码:%ld", (long)httpResp.statusCode);// 证明网站正常且请求到数据了
if (httpResp.statusCode == 200 && data) { // 数据处理
}
处理数据
将获取到的json转换为ios可用的字典,在按照需要,取出数据即可
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
原生网络请求总结
简单来说,oc的原生网络请求即:
拼接字符串——>使用管理网络请求的单例创建网络请求任务——>处理请求得到的数据等内容
AFNetworking
AFNetworking整体流程相对于原生请求要更简单一点,他将很多底层的细节全部隐藏起来,让你可以使用代码来实现功能
管理器 AFHTTPSessionManager
从头开始,我们在AFNetworking里需要的第一个东西是一个类似于NSURLSession
的东西,它也是一个单例,也同样负责处理所有的网络请求任务
与原生的不同的是,它只需要你提供需要做什么,URL,和链接即可
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.responseSerializer = [AFJSONResponseSerializer serializer];// 设置了响应序列化器可以接受的 Content-Type 类型// AFNetworking 默认只接受 application/json 类型的 JSON 数据。如果服务器返回的 Content-Type 是 text/html 但内容却是 JSON,AFN 就会报错manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];manager.requestSerializer.timeoutInterval = 15; //超时时间NSString *urlStr = [NSString stringWithFormat:@"%@/forecast.json", self.baseURL];// 准备请求参数NSDictionary *parameters = @{@"key": self.apiKey,@"q": city,@"aqi": @"yes",@"days": @"10",@"lang": @"zh"};NSLog(@"向%@ 请求数据", [manager.requestSerializer requestWithMethod:@"GET" URLString:urlStr parameters:parameters error:nil].URL.absoluteString);
其中,需要注意的有一行代码
manager.responseSerializer = [AFJSONResponseSerializer serializer];
这行代码设置了管理器的响应序列化器,响应序列化器 负责将服务器返回的原始二进制数据 (NSData
) 转换成 Objective-C 对象(如 NSDictionary
或 NSArray
)
这里的AFJSONResponseSerializer
专门处理JSON格式的响应,AFN会自动把服务器返回的JSON数据解析成字
剩下是参数组装,以及超时时间的设置
get请求
[manager GET:urlStrparameters:parametersheaders:nilprogress:nilsuccess:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {// 成功的操作}failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {// 错误的操作
}];
发起get请求要求五个参数,
URL字符串:请求的URL
参数字典:想要设置的参数,以字典方式创建
headers(可选的NSDictionary类型):HTTP请求头字典,包含授权令牌、用户代理等信息
downloadProgress(可选的NSProgress类型块):用于跟踪下载进度的块对象,可用于更新UI显示
success和failure的两个代码块:分别为任务失败和成功对应的操作,原本的数据处理在这里进行
小tip:在oc中,如果一个方法过长,Apple的官方写法规范是将参数对应的冒号对齐来显示
这样一个基与AFN的基本的网络请求就完成了
Post请求
POST
请求通常用于向服务器提交数据,比如登录、注册、上传文件等。在 AFNetworking 中,它的用法和 GET
请求非常相似,核心区别在于请求方法和参数的传递方式
在 POST
请求中,参数通常作为请求体(Request Body)的一部分发送,而不是附加在 URL 的末尾。这使得它更适合传输敏感信息(如密码)和大量数据
post的方法与get方法所需的参数没有什么区别,二者的区别只在于post请求的参数会被放在请求体中,参数不会被暴露在URL里
对比AFN和原生的区别
简单对比原生网络请求和AFN的网络请求,我们不难发现,二者的基本结构是差不多的,都是需要一个任务管理器来进行网络请求
区别在于AFN帮你省略了任务创建和任务解析,并简化了在网络请求完成之后的处理例如错误处理,数据处理,以及回调的线程位置