========================================================================================
要运行示例项目,首先克隆仓库,然后从 Example 目录运行 pod install
。
SporeNetworking 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
@example.com, @example.com
pod "SporeNetworking", "~> 0.1"
SporeNetworking 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。
SporeNetworking
是实现 POP
面向协议编程的网络层,旨在打造一个可热插拔的网络组件。
是蘑菇租房 iOS 底层优化工程的一部分。
即将用作蘑菇租客、蘑菇伙伴的网络层。
pod SporeNetworking, ~> 0.1
克隆整个工程,导入 class
文件下的所有 Swift
文件
配置内容大致包括以下几个方面
agent
、content-type
等等 HTTP 协议中规定的字段。URL
中是否要接入固定的参数。基于以上问题的考虑,建议的 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 ...
详细设置请参考示例代码
每个具体的 API
需要继承 BaseAPI
基类,只需要做两件事情就可以
path
。示例
class HotBusinessAreaAPI: BeRequested {
// 定义 Path
override var path: String ...
// 返回参数
override func contentParameters() -> [String : Any] ...
}
详见示例代码
数据模型需要实现协议 BeResponsed
,该协议中需要实现从 JSON -> Model 的方法。
发起网络请求的 session
的 send
方法是一个泛型方法,调用此方法时,需要指定返回类型。
参考示例代码
struct BusinessArea: BeResponsed {
/*!
数据模型中的各种属性
*/
var list: ...
/*!
协议 BeResponsed 中的方法, 功能从 JSON -> Model
如果有嵌套类型, 也需要在这里实现
*/
static func buildModel(response: Response) throws -> BusinessArea ...
}
let loadArea: HotBusinessAreaAPI = HotBusinessAreaAPI.init()
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 实现。