Kringle
您真的需要Alamofire吗?您会使用所有这些功能吗?您甚至知道它们是什么吗?您只想要下载一些JSON并将其解析为合约然后结束吗?这正是Kringle的用途。
Kringle是我的猫。它也是一个小型且具有偏见(意见化)的网络框架。它是为了简单而设计的,实际上只是对URLSession的一个薄抽象。
特性
- Promise。 使用Google的Promises框架来提供管理完成处理程序和异步行为的一般合理方式
- JSON反序列化。 JSON响应数据在后台队列中反序列化为遵循Decodable协议的对象。因此,如果您的大型JSON数据集,您的应用程序不会卡死
- 自动cookie管理。 如果响应包含带有未来到期日期或根本没有到期日期的
Set-Cookie
头,则将存储cookie。同样,如果响应包含带有过去到期日期的Set-Cookie
,则将删除cookie(参见RFC-6265第4.1.2节)
设计
我说这是一个有观点的框架。与这个框架的接口是通过NetworkClient实现的。这个类仅暴露了八个方法。每个方法名称都与HTTP方法名称相对应。到目前为止,仅支持delete
、get
、post
和put
。我忽略了其他方法,例如patch
,因为即使有人说它们使用,实际上也没有人使用。
这些方法接受一个Endpoint类型,如果端点不需要响应,则返回一个Promise<void>
,或者返回一个Promise<T>
,其中T是一个可解码类型。添加Promise纯粹是为了提升开发者体验。
Endpoint类型是一个枚举。这是受几年前Chris Eidhof的一篇帖子启发的。
enum CatEndpoint {
case cuddle
case pet(catName: String)
case feed(catName: String)
}
extension CatEndpoint: Endpoint {
var baseURL: URL { return URL(string: "https://api.kringlekitty.com")! }
var path: String {
switch self {
case .cuddle:
return "/kittycuddles"
case .pet(let catName):
return "/pet/\(catName)/"
case .feed(let catName):
return "/feed/\(catName)/"
}
}
}
下面是如何在端点上调用GET请求的方法。
let cat = CatEndpoint.pet(catName: "Kringle")
networkClient = NetworkClient()
// This performs a GET request on https://api.kringlekitty.com/pet/Kringle
networkClient.get(cat).then { _ in
print("🐱")
}.catch { error in
print("You gotta be kitten me!")
}
开发
这个框架是用Swift Package Manager创建的。在克隆存储库后开始使用最简单的方法是运行swift build
来安装所有依赖项。