DBNetworkStack

Build Status codebeat badge codecov Swift Package Manager compatible

主要特性
🛡 类型化的网络资源
🏠 面向值的架构
🔀 可交换的实现
🚄 可扩展的 API
🎹        可组合的特性         
完全单元测试
📕  文档在此           

这个项目背后的想法来自这篇 talk.objc.io 文章

基本演示

假设你想获取一个 html 字符串。

首先,你需要创建一个服务,通过提供网络访问。你可以直接使用 URLSession,或者通过实现 NetworkAccess 来提供你自己的自定义解决方案。

let networkAccess = URLSession(configuration: .default)
let networkService = BasicNetworkService(networkAccess: networkAccess)

创建一个资源,并包含一个获取数据的请求。

let url = URL(staticString: "https://httpbin.org")
let request = URLRequest(path: "/", baseURL: url, HTTPMethod: .GET)
let resource = Resource(request: request, parse: { String(data: $0, encoding: .utf8) })

请求你的资源并处理结果

networkService.request(resource, onCompletion: { htmlText in
    print(htmlText)
}, onError: { error in
    //Handle errors
})

加载符合 Swift-Decodable 的类型

struct IPOrigin: Decodable {
    let origin: String
}

let url = URL(staticString: "https://www.httpbin.org")
let request = URLRequest(path: "ip", baseURL: url)

let resource = Resource<IPOrigin>(request: request, decoder: JSONDecoder())

networkService.request(resource, onCompletion: { origin in
    print(origin)
}, onError: { error in
    //Handle errors
})

访问 HTTPResponse

请求你的资源并处理结果和 http 响应。这类似于仅仅请求一个结果模型。

networkService.request(resource, onCompletionWithResponse: { origin, response in
    print(origin, response)
}, onError: { error in
    //Handle errors
})

面向协议的架构 / 可交换性

下表显示了所有协议及其默认实现。

协议 默认实现
NetworkAccess URLSession
NetworkService BasicNetworkService
NetworkTask URLSessionTask

可组合的特性

特性
RetryNetworkService 当错误符合给定条件时,在给定的延迟后重试请求。
ModifyRequestNetworkService 修改匹配的请求。可以用于添加身份验证令牌或 API 密钥
NetworkServiceMock 模拟 NetworkService。可在单元测试期间使用

要求

安装

Swift 包管理器

SPM 与 Swift 构建系统集成,以自动执行下载、编译和链接依赖项的过程。

在你的 Package.swift 中指定以下内容

.package(url: "https://github.com/dbsystel/DBNetworkStack", from: "2.1.0"),

贡献

欢迎提交包含新特性、测试或文档改进以及 bug 修复的 pull request。请记住,我们欢迎经过良好测试和记录的代码。

联系方式

Lukas Schmidt (邮件, @lightsprint09), Christian Himmelsbach (邮件)

许可

DBNetworkStack 在 MIT 许可证下发布。 有关详细信息,请参见 LICENSE。