当前位置: 首页 > news >正文

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 对象(如 NSDictionaryNSArray

这里的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帮你省略了任务创建和任务解析,并简化了在网络请求完成之后的处理例如错误处理,数据处理,以及回调的线程位置

http://www.dtcms.com/a/393967.html

相关文章:

  • vscode连接ubuntu18报Gilbc2.28错
  • 华为超节点 384 集群: AI 算力的架构革新与实践
  • mescroll-uni 完全指南——Vue3 setup格式
  • 动态规划算法的欢乐密码(六):子数组系列(下)
  • StringBuilder与StringBuffer区别详解
  • 深入浅出 Scikit-learn:从入门到实战的机器学习工具包指南
  • 乡村社区服务管理系统的设计与实现-(源码+LW+可部署)
  • Spring Framework
  • 01 定位器项目笔记——知识复习回顾
  • 《Python实现图像剪辑:从基础裁剪到高级滤镜处理》
  • 【图像处理基石】工业检测中使用的图像处理算法有哪些?
  • Arbess,一款比Jenkins轻量、简洁的开源CICD工具
  • 平替PostMan,推荐一款国产开源免费的接口管理工具 - PostIn
  • 17.8 AI智能革命:ChatPPT多模态交互系统3秒生成零冲突PPT,效率提升85%
  • OceanBase数据库锁冲突排查
  • FPGA流水线除法器/加法器/乘法器_设计详解
  • 使用VBA辅助编辑出具有完美导航功能的Word长文档
  • [已更新]2025华为杯C题数学建模研赛C题研究生数学建模思路代码文章成品:围岩裂隙精准识别与三维模型重构
  • 269-基于Python的58同城租房信息数据可视化系统
  • kafka高可用数据不丢失不重复分区内有序性
  • KRaft 运维从静态到动态 Controller
  • 自动语音识别--Zipformer ASR模型
  • 计算机视觉与深度学习 | 图像去雾算法综述:原理、公式与代码实现
  • MySQL sql语言简介和DDL语句介绍
  • [数据结构] 二叉树
  • 4+10+N,华为坤灵“求解”中小企业智能化
  • ECharts 四川省地图渲染与交互效果实现
  • Zynq开发实践(SDK之自定义IP3 - 软件IP联调)
  • VMware虚拟机中CentOS的network配置好后ping不通问题解决方法
  • 传输层————TCP