Swapi
一个简单的网络抽象库,仅使用 URLSession。支持 Swift 4.0 的 Decodable 协议进行 JSON 反序列化。无偏见且简单。
大多数应用程序都有一个共同点,那就是 API 调用。我们有时会因需求而感到困惑并问“我们从哪里开始?”。您可以在 iOS 应用中立即定义您的 API!无论它们的规模有多大!不再需要“APIHelpers”或“APIManagers”。Swapi 以小巧的足迹满足您的基本 API 需求!
Swapi: SwiftAPI :]
安装
目前您可以通过CocoaPods来获取Swapi,在Podfile中添加以下内容:
pod 'swapi', '~> 0.9.3'
使用方法
定义API
使用Swapi定义API既简单又有趣,与Swift配合得很好。创建一个符合APIDefinitionProtocol枚举,并按需实现您API的属性。以下是一个示例:
import swapi
enum MusicAPI {
case search(term: String, limit: Int)
}
extension MusicAPI: APIDefinitionProtocol {
var method: HttpMethod {
switch self {
case .search(_,_):
return .GET
}
}
var baseURL: String {
return "https://itunes.apple.com/"
}
var path: String {
switch self {
case .search(_,_):
return "search"
}
}
var url: String {
return "\(self.baseURL)\(self.path)"
}
var paramsType: ParamsType {
switch self {
case .search(_,_):
return .QueryString
}
}
var additionalQueryString: [String : String]? {
return nil
}
var apiKeyRequired: Bool {
return false
}
var apiKey: String? {
return nil
}
var apiKeyName: String? {
return ""
}
var apiKeyLocation: valueLocation? {
return .none
}
var parameters: [String : String]? {
switch self {
case let .search(term, limit):
return ["term": term, "limit": "\(limit)"]
}
}
var headers: [String : String]? {
return nil
}
var sharedHeaders: [String : String]? {
return nil
}
}
调用API
按照以下方式使用APIRequester中的request(_,_,_)
方法调用定义的API。库将返回一个包含反序列化响应或错误的结果对象。
APIRequester.shared.request(endpoint: MusicAPI.search(term: term, limit: 25), deserialize: ResultResponse.self) { (result) in
DispatchQueue.main.async {
switch result {
case let .success(response):
if let searchResults = response {
self.results = searchResults.results
self.tableView.reloadData()
}
break
case let .failure(error):
switch error.innerError {
case .connectionError:
...
break
case .badRequest:
...
break
default:
break;
}
break
}
}
}
如果您想使用经典的URLSession回调,可以调用RequestRaw(_,_)
。
APIRequester.shared.requestRaw(endpoint: MusicAPI.search(term: "OneRepublic", limit: 25)) { (data, response, error) in
...
}
您可以将自己的URLSession传递过去。
APIRequester.shared.request(endpoint: MusicAPI.search(term: "Coldplay", limit: 25), deserialize: ResultResponse.self, session: yourURLSession) { (result) in
...
}
定义模型
您可以使用Swift 4中的Decodable来定义模型,并将其传递给Swapi进行反序列化,如request(_,_,_)
示例所示。
struct Result: Decodable {
var artistId: Int
var trackId: Int
var kind: String
var artist: String
var collection: String
var trackName: String
private enum codingKeys: String, CodingKey {
case artistId = "artistId"
case trackId = "trackId"
case kind = "kind"
case artist = "artistName"
case collection = "collectionName"
case trackName = "trackName"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: codingKeys.self)
artistId = try container.decode(Int.self, forKey: .artistId)
trackId = try container.decode(Int.self, forKey: .trackId)
trackName = try container.decode(String.self, forKey: .trackName)
artist = try container.decode(String.self, forKey: .artist)
collection = try container.decode(String.self, forKey: .collection)
kind = try container.decode(String.self, forKey: .kind)
}
}
日志记录
您可以为调试开启日志记录功能。
APIRequester.shared.debugLogging = true
关于
我最初撰写这篇文档时正在与ArabiaWeather Inc.合作,并且在生产中使用过。这是一个基本的开源版本,我将很快对其进行更新和改进。
贡献
对任何反馈、错误报告或想法,请随意提出问题或甚至是拉取请求。
流水线
- 更好的文档
- 发布测试
- 更好的日志记录
- 更多功能:]