使用Alamofire和EVReflection自动映射和解析JSON

我经常使用Alamofire进行HTTP联网,这是用Swift编写的流行联网库。 因此,它是极其强大的库,易于使用,但是在进行网络操作时,我经常需要抽象层来封装Alamofire而不是直接调用它。

我在过去的项目中确实使用Moya作为抽象,所以基本上,它提供了Manager类来定义端点,请求参数等的明确用法。因此,我确实创建了自己的Manager单例来管理这些东西。

在设计模型时,我们需要为每个请求的JSON值实现映射,并为我的模型实现响应周期 ,但是如果响应JSON结构经常更改(需求可以快速更改,可以快速转换请求/响应),那将是痛苦的。

我以前有在Swift中使用Reflection的经验,所以确实有机会在新项目中尝试EVReflection。

什么是EVReflection?

EvReflection是一个带有反射功能的Swift帮助程序库,该功能支持NSCoding,Printable,Hashable,Equatable和JSON。

  • 将基于NSObject的对象解析为字典。
  • 将字典解析回一个对象。
  • 从字符串值创建一个类并获取一个类的字符串值。
  • 支持NSCoding方法encodeWithCoder和decodeObjectWithCoder
  • 使用所有属性时,支持可打印,可哈希和等于。 (支持Swift 1.2中的Set)
  • 将对象解析为JSON字符串,并将JSON字符串解析为对象

从EVReflection中裁剪

实施请求/响应模型

首先,我们需要设置从EVReflection(EVObject)基类继承的请求/响应模型。 适用于所有请求的BaseRequest,适用于应用程序中所有响应的BaseResponse以及用于解析错误JSON结构 (如果存在)的ErrorResponse (如果接收到用于警报,通知等的错误响应对象)

因此,如果JSON中包含错误有效负载以进行映射,则需要对其进行解析。

我们可以传递额外的默认值,例如应用程序的当前版本,内部版本号或任何其他数据。

然后,在下面的示例中,我们可以简单地声明从BaseRequest / BaseResponse类继承的Request / Response模型 因此, 从EVObject继承的模型将自动进行映射

另外,如果您需要使用某些值作为请求/响应,我们可以通过实例化类来设置默认值

最后,定义一个采用请求参数(BaseRequest)和完成处理程序响应(BaseResponse)的方法为我们提供了完成处理程序。 (我们也可以在此处进行网络状态检查等。)

好处

  • 我们不需要为模型编写映射或为JSON响应(以及请求)使用某些映射库。
  • 我们确保正确定义请求/响应周期 ,我们完全知道请求的内容,并且知道响应应该做什么。
  • 我们确实使用可达性检查了网络状态 (您可以自己实施)
  • 我们通过Alamofire的validate()方法确保它是经过验证的响应。 它会自动验证 200...299 范围 内的状态码 ,并且如果提供的话,响应的Content-Type标头与请求的Accept标头匹配。
  • 我们有AccountResponse(BaseResponse)和错误(如果有)作为响应
  • 我们使用了AlamofireJSONToObjects库, 使用EVReflection (作为Alamofire扩展名) 将JSON响应数据转换为Swift对象
  • 我们拥有干净,可测试的实现,可以重复使用以支持不同的API请求。

这是创建请求的示例方法

如您所见, responseObject 由AlamofireJSONToObjects 包装 ,它使用面向结果的通用方法。

最后,在完成代码块中,我们神奇地从JSON转换了accountResponse模型对象。

现在就这些了🎉