HROmni.SwiftApiClient 0.1.5

HROmni.SwiftApiClient 0.1.5

HR Omni Solutions 维护。



  • Panayot Panayotov

SwiftAPIClient

Group 3032 (3)

轻量级且设计简单的 Swift API 客户端,采用面向协议的编程方式编写。你可以使用 async awaitCombine 发布者发送请求,而不需要做任何更改。 SwiftAPIClient 可以帮助你使用仅几行代码实现 HTTP 和服务器 API 调用。

HR Omni Solutions 开源

目录
使用 SPM 安装
使用枚举定义您的端点
使用结构体定义端点
解码 JSON 响应
使用 Combine 发送请求
使用 async 发送请求
响应验证
贡献

Swift Package Manager

Swift Package Manager 是一个用于自动化 Swift 代码分发工具,集成到 swift 编译器中。

在你的 Swift 包设置好之后,添加 SwiftAPIClient 作为依赖项与将它添加到 Package.swift 中的依赖项值一样简单。

dependencies: [
    .package(url: "https://github.com/hromni/SwiftAPIClient.git", .upToNextMajor(from: "0.1"))
]

Cocoapods

pod 'SwiftApiClient'

pod 'SwiftApiClient', :git => '[email protected]:hromni/SwiftAPIClient.git'

使用枚举定义你的端点

import Foundation
import SwiftAPIClient

enum Endpoints: Endpoint {

    case getData, addData(_ name: String)

    var baseUrlString: String {  "https://example.com/" }

    var httpBody: RequestBody? {
        switch self {
        case .addData(let name):
            return .jsonDictionary(["name" : name])
        default: return nil
        }
    }

    var httpMethod: HTTPMethod {
        switch self {
        case .getData: return .get
        case .addData: return .post
        }
    }

    var path: String {
    // URL path should always start with forward slash
        switch self {
        case .getData:
            return "/getData"
        case .addData(let data):
            return "/addData"
        }
    }
    
}

使用代码块示例端点

struct GetDataEndpoint: Endpoint {
    var baseUrlString: String {  "https://example.com/" }
    // URL path should always start with forward slash
    var path: String { "/getData" }
}

解码JSON响应

如果你期望获得JSON响应,可以使用`JsonResponse`协议,它是带有一些额外内置功能的`Decodable`包装器。你也可以通过遵守`Response`协议来创建自己响应类型。

import Foundation
import SwiftAPIClient

struct ExampleDataResponse: JsonResponse {
   let name: String
}

使用Combine发送请求

使用端点创建Combine客户端包装器

struct ApiClient {
    static func getData() -> AnyPublisher<ExampleDataResponse, SwiftApiClientError> {
        Endpoints.getData.send() 
        // GetDataEndpoint().send()
    }
}

使用异步发送请求

如前所述,端点自动处理 Combineasync,因此您可以使用任一方法。例如,如果您想使用 async,只需将 send() 替换为使用上面相同的 Endpoints 定义中的 asyncSend()

struct ApiClient {
    static func getData() async throws -> ExampleDataResponse {
        try await Endpoints.getData.asyncSend() 
        // try await GetDataEndpoint().asyncSend()
    }
}

验证响应

默认的验证器代码如下。

struct BasicResponseValidator: ResponseValidator {
    public func validate(_ response: (data: Data, response: URLResponse)) throws {
        if let statusCode = (response.response as? HTTPURLResponse)?.statusCode,
           statusCode >= 300 {
            throw SwiftApiClientError.serverError(statusCode: statusCode, payload: response.data)
        }
    }
}

您还可以创建自己的验证器,使其遵守

public protocol ResponseValidator {
    func validate(_ response: (data: Data, response: URLResponse)) throws
}

然后将它作为验证器传送给您的端点,以替换默认的响应验证

贡献

欢迎贡献者。