NetworkMapper
一个框架,用于基于 Alamofire 和 Unbox 将 JSON 响应映射到 Swift 对象。
## 安装
Cocoapods
pod 'NetworkMapper', '~> 0.1.23'
用法
NetworkMapper 使用协议来实现功能。这些协议只要求您为请求的实例变量定义方法、URL 和参数。
基本请求
您可以通过符合 NetworkRequest
来制作基本请求,不映射响应。您可以使用 responseJSON
或 responseData
从服务器获取响应。
struct ExampleRequest: NetworkRequest {
let method: HTTPMethod = .get
let url: URL = URL(string: "https://example.org/example/user")
let parameters: [String:Any]? = nil
}
ExampleRequest().responseJSON { response in
switch response.result {
case .failure(let error):
// process error
case .success(let json):
// process response
}
}
映射请求数据
映射请求数据稍微更复杂一些。映射请求数据要求您创建一个符合 NetworkObjectRequest
和 NetworkObjectResponse
的对象。
响应协议要求您符合 Unboxable
协议,更多详细信息请参阅其 文档。响应对象被认为 JSON 应答的根对象。目前不支持数组作为根对象。
请求协议在 NetworkRequest
的基础上增加了 associatedtype,用于指定响应对象的类型。请求完成时,JSON 对象会被映射到响应对象。还有一个可选实现的其他函数 responseDecoded
,默认实现为不执行任何操作。
struct ExampleObjectRequest: NetworkObjectRequest {
typealias ResponseType = ExampleObjectResponse
let method: HTTPMethod = .get
let url: URL = URL(string: "https://example.org/example/users")
let parameters: [String:Any]? = nil
}
struct ExampleObjectResponse: NetworkObjectResponse {
let users: [User]
let pageNumber: Int
init(unboxer: Unboxable) throws {
self.users = try unboxer.unbox(key: "users")
self.pageNumber = try unboxer.unbox(keyPath: "pagination.page_number")
}
}
struct User: Unboxable {
let name: String
let age: Int
init(unboxer: Unboxable) throws {
self.name = try unboxer.unbox(key: "name")
self.name = try unboxer.unbox(key: "age")
}
}
ExampleObjectRequest().responseObject { response in
switch response.result {
case .failure(let error):
// process error
case .success(let object):
// process response
}
}