SporeNetworking 0.2.2

SporeNetworking 0.2.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2018年3月
SPM支持 SPM

loohawe 维护。



SporeNetworking

========================================================================================

SporeNetworking

CI Status
Version
License
Platform

示例

要运行示例项目,首先克隆仓库,然后从 Example 目录运行 pod install

要求

安装

SporeNetworking 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
@example.com, @example.com

pod "SporeNetworking", "~> 0.1"

作者

@example.com, @example.com

许可证

SporeNetworking 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。

简介

SporeNetworking 是实现 POP 面向协议编程的网络层,旨在打造一个可热插拔的网络组件。
是蘑菇租房 iOS 底层优化工程的一部分。

即将用作蘑菇租客、蘑菇伙伴的网络层。

安装

CocoaPod

pod SporeNetworking, ~> 0.1

暂不支持 Carthage

或者手动导入(不建议)

克隆整个工程,导入 class 文件下的所有 Swift 文件

用法

1. 配置 SporeNetworking 使其符合业务需求

配置内容大致包括以下几个方面

  • 网络请求头文件中包含哪些固定的字段值,例如 agentcontent-type 等等 HTTP 协议中规定的字段。
  • 请求 URL 中是否要接入固定的参数。
  • 网络安全相关的设置,例如 HTTP 头字段中是否要加入相关字段做认证等等
  • 每个网络请求是否有固定的参数格式
    ...

基于以上问题的考虑,建议的 SporeNetworking 的使用方式如下

  • 定义 MogoAPIRequest 的协议,继承于 SporeNetworking 中的 BeRequested 协议。
    extension 中给出默认实现
    各个属性或方法的含义在代码的注释中给出

protocol MogoAPIRequest: BeRequested {
...
}

extension MogoAPIRequest { 
/*!
网络请求 URL 的 Base URL, 也可以叫主机地址.
如果要切换网络环境, 更改此属性既可.
*/
var baseURL: URL ...

/*!
网络请求 URL 的后半部分, 此属性需要子类复写.
需要注意的是, 这部分字符串再拼接到完整 URL 后并不会进行特殊字符转义.
*/
var path: String ...

/*!
HTTP 协议的头部字段.
*/
var headerFields: [String : String] ...

/*!
设置 HTTP 头部的 "Content-type" 字段.
设置 Body 里的数据传输方式.
其中唯一的一个方法返回值将用来设置 URLRequest.httpBody 或 URLRequest.inputStream
*/
var bodyParameters: BodySerialization ...

/*!
网络请求的参数.
如果 method 为 get, delete, head , 该参数将被拼接在 URL 后边.
如果 method 为其他方式, 该参数将由 bodyParameters 决定在 body 中传输方式.
*/
final func buildParameters() -> [String : Any]? ...

/*!
网络请求有返回值后, 会首先调此方法进行业务有关的数据处理.
比如如何解析 Data 数据, 验证返回数据是否完整等等.
如果此方法中有异常, 需要 throw Response error
*/
func parseResponse(data: Data?, urlResponse: HTTPURLResponse) throws -> Response ...

详细设置请参考示例代码

2. 业务中各个 API 声明

每个具体的 API 需要继承 BaseAPI 基类,只需要做两件事情就可以

  1. 定义 path
  2. 返回此次请求的参数。

示例

class HotBusinessAreaAPI: BeRequested {

// 定义 Path
override var path: String ...

// 返回参数
override func contentParameters() -> [String : Any] ...

}

详见示例代码

3. 网络请求返回数据模型的定义

数据模型需要实现协议 BeResponsed,该协议中需要实现从 JSON -> Model 的方法。

发起网络请求的 sessionsend 方法是一个泛型方法,调用此方法时,需要指定返回类型。

参考示例代码

struct BusinessArea: BeResponsed {

/*!
数据模型中的各种属性
*/
var list: ...

/*! 
协议 BeResponsed 中的方法, 功能从 JSON -> Model
如果有嵌套类型, 也需要在这里实现
*/
static func buildModel(response: Response) throws -> BusinessArea ...
}

4. 发起网络请求

  1. 实例化一个 API 对象。
let loadArea: HotBusinessAreaAPI = HotBusinessAreaAPI.init()
  1. session 发起网络请求,返回由 Result 枚举给出。
let _ = Session.shared.send(loadArea, callbackQueue: .main) {
(result: Result<BusinessArea, SessionTaskError>) in

print("call back")

switch result {
case .success(let user):
print("\(user)")
case .failure(let sessionError):
print("\(sessionError)")
}
}

示例代码

其中部分思路参考 APIKit 设计,URL 中参数拼接方式参考 Alamofire 实现。