AFNetworking 框架小结 二(AFURLResponseSerialization)

2024-06-06 13:08

本文主要是介绍AFNetworking 框架小结 二(AFURLResponseSerialization),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AFURLResponseSerialization

响应报文解析器

在 AFNetworking 网络框架中,为了方便处理网络返回的响应报文,特抽象出来一个响应报文解析器,其相关的类都在 AFURLResponseSerialization.h 文件中。相较于网络请求报文构造器,解析器要简单的多,其关键为抽象类 AFHTTPResponseSerializer 以及其遵循的 AFURLResponseSerialization 协议。

AFHTTPResponseSerializer

AFHTTPResponseSerializer 会对响应报文做一些基本的处理,所以自定义处理 HTTP 响应报文时,应扩展其子类以保证基本的报文处理得以进行,不过,该框架中提供的子类解析器已经满足了大部分需要。

在 AFHTTPResponseSerializer 类中定义了两个重要的属性和一个判断响应报文是否有效的方法。

@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes;
@property (nonatomic, copy, nullable) NSSet <NSString *> *acceptableContentTypes;
  • acceptableStatusCodes 合法的报文状态码集合
  • acceptableContentTypes 合法的报文体数据类型集合

上述两个属性会在下面的方法中被用来判断响应报文是否是有效报文,当然,如果这两个属性为 nil ,那么便不会使用其进行判断。

- (BOOL)validateResponse:(nullable NSHTTPURLResponse *)responsedata:(nullable NSData *)dataerror:(NSError * _Nullable __autoreleasing *)error;

调用上面的方法,判断 response 的 MIMEType 属性值是否在 acceptableContentTypes 集合中,response 的 statusCode 属性值是否在 acceptableStatusCodes 范围内,并且 data 是否存在,如果校验不通过,相关的错误信息会保存在 error 中并返回 NO 。

在创建解析器时,可以调用类方法 serializer ,在该方法中,会初始化 acceptableStatusCodes 属性集合的范围为 200~300 ,而 acceptableContentTypes 会被置为 nil 。

AFURLResponseSerialization

该协议只提供了一个方法,用来解析响应报文中的数据,最后的返回值为解析后的数据。在自定义 AFHTTPResponseSerializer 的子类时,应该重写该协议方法,因为 AFHTTPResponseSerializer 类中并未对与报文相关的 data 数据进行额外的处理,而是直接返回了。

- (nullable id)responseObjectForResponse:(nullable NSURLResponse *)responsedata:(nullable NSData *)dataerror:(NSError * _Nullable __autoreleasing *)error NS_SWIFT_NOTHROW;

AFJSONResponseSerializer

AFJSONResponseSerializer 类重写了父类 AFHTTPResponseSerializer 中的实例创建方法和初始化方法,并提供了下面的类方法用于创建解析 JSON 数据的实例对象。

+ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions;

并且可以通过设置 removesKeysWithNullValues 属性值为 YES 来过滤为 NULL 的数据。

在创建 JSON 数据的解析器时,其初始化方法,会将有效的报文类型集合设置为 application/jsontext/jsontext/javascript ,如下:

self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];

这样在校验报文数据时,就会过滤掉非 JSON 格式的返回报文,然后使用 NSJSONSerialization 解析 JSON 数据得到相应的对象,如果需要移除为 NULL 的值,则会接着调用下面的函数。

static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions)

AFXMLParserResponseSerializer

AFXMLParserResponseSerializer 同样是 AFHTTPResponseSerializer 的子类,只是其并未增加属性,只是重写了父类的方法。

在初始化方法中将 acceptableContentTypes 设置为 application/xmltext/xml 的集合。

在 AFURLResponseSerialization 协议的方法中,使用接收到的数据创建了一个 XML 数据解析器 NSXMLParser 并返回,进一步的解析则由用户负责。

AFXMLDocumentResponseSerializer

AFXMLDocumentResponseSerializer 与 AFXMLParserResponseSerializer 类似,有相同的报文类型集合,但是其重写的解析方法最后返回的是 NSXMLDocument 对象。

该解析器只适用于 Mac OS X 系统中

AFPropertyListResponseSerializer

AFPropertyListResponseSerializer 可以用来解析类型为 application/x-plist 的返回报文,在重写 AFURLResponseSerialization 中的方法时,会创建并返回一个 NSPropertyListSerialization 类实例对象。

AFImageResponseSerializer

AFImageResponseSerializer 用来解析请求到的图片数据,其默认支持的图片格式如下:

  • image/tiff
  • image/jpeg
  • image/gif
  • image/png
  • image/ico
  • image/x-icon
  • image/bmp
  • image/x-bmp
  • image/x-xbitmap
  • image/x-win-bitmap

在该子类中,声明了 imageScaleautomaticallyInflatesResponseImage 两个属性,前者指定图片的缩放值,默认为设备屏幕的缩放值。后者指明是否调用函数 AFInflatedImageFromResponseWithDataAtScale 对请求的图片的透明度信息进行填充,默认为 YES ,即进行填充。

在 AFInflatedImageFromResponseWithDataAtScale 函数中,只会对类型为 PNG 和 JPEG 类型的图片进行处理,并且图片如果是 JPEG 类型且其颜色空间为 kCGColorSpaceModelCMYK 类型,也不会进行透明度信息的填充。

另外,获取的图片,其宽和高都要小于 1024 且通道信息的位数不能大于 8 。之后,如果设备所支持的颜色空间模型为 kCGColorSpaceModelRGB 则可以对图片的透明度信息进行处理,分为下面两种情况:

  • 图片的 kCGBitmapAlphaInfoMask 值为 kCGImageAlphaNone 即图片没有透明度信息,那么透明度信息设置为 kCGImageAlphaNoneSkipFirst
  • 图片的 kCGBitmapAlphaInfoMask 值不是 kCGImageAlphaNoneSkipFirstkCGImageAlphaNoneSkipLast 时,设置为 kCGImageAlphaPremultipliedFirst

这两个属性不适用于 Mac OS X 系统中。

AFCompoundResponseSerializer

组合解析器,使用该类可以将多个解析器组合到一个解析器中,用于多种类型数据的解析,对于无法确定返回的数据类型的情况很方便,其实现的方式主要是在重写的协议方法中遍历 responseSerializers 属性中的所有解析器进行数据解析,一旦解析成功,则返回解析结果,否则继续使用下一个解析器。

这些解析器可以是自定义的,但是必需遵循 AFURLResponseSerialization 协议,当然,可能遍历结束后,数据仍然无法解析,参见下面的源码。

- (id)responseObjectForResponse:(NSURLResponse *)responsedata:(NSData *)dataerror:(NSError *__autoreleasing *)error
{for (id <AFURLResponseSerialization> serializer in self.responseSerializers) {if (![serializer isKindOfClass:[AFHTTPResponseSerializer class]]) {continue;}NSError *serializerError = nil;id responseObject = [serializer responseObjectForResponse:response data:data error:&serializerError];if (responseObject) {if (error) {*error = AFErrorWithUnderlyingError(serializerError, *error);}
return responseObject;}}
return [super responseObjectForResponse:response data:data error:error];
}

要注意的是,创建该类时,不能使用父类声明的 serializer 方法,而是要使用该类自己声明的类方法。

+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray <id<AFURLResponseSerialization>> *)responseSerializers;

这篇关于AFNetworking 框架小结 二(AFURLResponseSerialization)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036193

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

Yii框架relations的使用

通过在 relations() 中声明这些相关对象,我们就可以利用强大的 Relational ActiveRecord (RAR) 功能来访问资讯的相关对象,例如它的作者和评论。不需要自己写复杂的 SQL JOIN 语句。 前提条件 在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作; 场景 申明关系 两张表之间的关系无非三种:一对多;一对一;多对多; 在