HPNetwork
HPNetwork
是一个使用纯 Swift 编写的基于协议的联网堆栈
安装
SPM
将 https://github.com/henrik-dmg/HPNetwork
添加为新的依赖项到您的 Xcode 项目中或将其添加到 Package.swift
的 .package(url: "https://github.com/henrik-dmg/HPNetwork/tree/feature/async", from: "3.0.0")
CocoaPods
将 pod 'HPNetwork'
添加到您的 Podfile 中并运行 pod install
发布请求
安排请求就像这样简单
let response = try await request.response()
<代码>响应是一个包含请求输出和统计信息的<代码>NetworkResponse
合并
您也可以在任意<代码>NetworkRequest实例上调用<代码>dataTaskPublisher()以获取一个<代码>AnyPublisher
同步请求
如果您使用Swift编写CLIs或其他任何原因需要进行同步网络通信,您可以使用<代码>scheduleSynchronously(...),它返回与常规方法调用闭包相同的<代码>Result
取消请求
任何对<代码>schedule(request) { result in ... }的调用都返回一个您可以通过调用<代码>task.cancel()来取消的<代码>NetworkTask实例。
创建请求
基础知识
HPNetwork采用了一种基于协议的方法,因此任何符合<代码>NetworkRequest的类型都可以作为请求进行调度。简单来说,这意味着您需要提供一个<代码>URL和一个请求方法。
示例 1
struct BasicDataRequest: DataRequest {
typealias Output = Data
var requestMethod: NetworkRequestMethod {
.get
}
func makeURL() throws -> URL {
// construct your URL here
}
}
示例 2
struct BasicDataRequest: DataRequest {
typealias Output = Data
let url: URL?
let requestMethod: NetworkRequestMethod
func makeURL() throws -> URL {
// construct your URL here
}
}
let basicRequest = BasicDataRequest(
url: URL(string: "https://panhans.dev/"),
requestMethod: .get
)
JSON
如果您正在处理 JSON,您也可以使用 DecodableRequest
,它需要一个提供的 JSONDecoder
。请求将使用该解码器将接收到的数据自动转换为指定的输出类型
示例 3
struct BasicDecodableRequest<Output: Decodable>: DecodableRequest {
let requestMethod: NetworkRequestMethod
var decoder: JSONDecoder {
JSONDecoder() // use default or custom decoder
}
func makeURL() throws -> URL {
// construct your URL here
}
}
拦截错误
默认情况下,NetworkRequest
实例将简单地将遇到的任何错误转发到完成块。如果您想根据接收到的原始 Data
进行自定义错误转换,您可以在您的请求模型中实现 func convertError(_ error: Error, data: Data?, response: URLResponse?) -> Error
。
URLBuilder
URLBuilder
已经被分离到单独的包 HPURLBuilder
中,可以在这里找到。
请求身份验证
要向请求添加身份验证,只需向请求提供 authentication: NetworkRequestAuthentication?
实例即可。NetworkRequestAuthentication
是一个枚举,支持基本身份验证(用户名和密码)、携带令牌授权或原始选项,如果您需要完全控制。
作者
- Henrik Panhans (@henrik_dmg)
工作进行中
- 取消支持
- 进度的回调
- 改进文档
- 为新的 Swift 版本添加
async
变体 - Cookie 支持