使用 Swift 中新的并发模型的 Async/await http 客户端

网络层,用于运行 GET、POST、PUT、DELETE 等请求,可通过编码器自定义。能够使用不同的策略重试请求

文档(API)

SwiftUI 示例

特性

Http requests

快速通道

1. 使用

   try await Http.Get.from(url, retry: 5, validate: [.status(200)])
   try await Http.Post.from(url, taskDelegate : TaskDelegate())
   try await Http.Put.from(url, body: data)
   try await Http.Delete.from(url)

快速通道函数返回 (Data, URLResponse),如果您需要验证状态代码,可以使用 func validateStatus 检查不同的策略 Http.Validate.Status

        let (data, response) = try await Http.Get.from(url)
        let rule : Http.Validate.Status = .range(200..<300)
        try validateStatus(response, by: rule)

扩展通道

1. 创建

    let url = URL(string: "https://:3000")
    let http = Http.Proxy(baseURL: url)

使用自定义配置

      let cfg = Http.Configuration(
                    reader: SomeReader(),
                    writer: SomeWriter(),
                    baseURL: baseURL,
                    session: session)
     let http = Http.Proxy(config: cfg)

2. 使用

GET

    try await http.get(path: "users")

GET 并重试

    try await http.get(path: "users", retry  : 5)

GET 并验证状态代码 200..<300

    try await http.get(path: "users", validate: [.status(.range(200..<300))])

POST

    try await http.post(
                        path: "users", 
                        body: data, 
                        query: [("name", "Igor"), ("page","1")], 
                        headers: ["Content-Type": "application/json"])

POST 并使用 Delegate 收集指标

    try await http.post(path: "users", taskDelegate: DelegatePickingUpMetrics())

PUT

    try await http.put(path: "users", body: data)

DELETE

    try await http.delete(path: "users")

自定义请求

        public func send<T>(
            with request : URLRequest,
            retry strategy : RetryService.Strategy = .exponential(),
            _ validate : [Http.Validate] = [.status(200)],
            _ taskDelegate: ITaskDelegate? = nil
        ) async throws -> Http.Response<T> where T : Decodable

重试策略

此软件包使用独立的软件包提供重试策略。该服务根据选择的策略创建延迟序列(纳秒),有关更多详细信息,请访问链接 retry service

类型 描述
constant 该策略实现恒定退避
exponential [默认] 该策略实现指数退避

验证

是用于检查 URLResponse 的不同规则的数组。当前已实现用于验证状态代码。

状态代码

类型 描述
const(Int) [默认] 200 按精确值验证
range(Range) [默认] 200..<300 按范围验证
predicate(Predicate) 如果您需要一些特定的处理逻辑,则通过谓词函数进行验证
check(ErrorFn) 检查状态,如果状态无效,则返回自定义错误

按范围

    try await http.get(path: path, validate: [.status(.range(200..<300))])

按谓词

    let fn : (Int) -> Bool = { status in status == 201 }
    
    try await http.get(path: path, validate: [.status(.predicate(fn))])

这里有一个示例 replicate toolkit for swift,说明如何将其与自定义响应错误格式一起使用,该格式与成功的响应格式不同

概念

The concept

在真实环境中尝试

简单的服务器安装(使用 NodeJS Express 模拟)

为了在真实环境中尝试它。我建议安装基本的 NodeJS Express 样板。请观看视频片段,了解通过 Webstorm 获取它有多么容易,Webstorm 在试用期内可以免费使用。

Server installation (NodeJS Express)

使用的软件包

Replicate toolkit for swift