ZComNet

用于 Swift REST API 异步/等待调用的轻量级库

最低目标 操作系统
16.0 iOS
13.0 macOS

安装

你可以通过 Swift Package Manager 安装

Xcode 用户界面

前往你的项目设置 -> Swift Packages,插入此仓库的 GitHub 链接,然后点击 Add Package

集成到 Package.swift 中

不使用 Xcode 集成,你可以将以下内容添加到你的 Package.swift 文件中的 dependencies 中

dependencies: [
	.package(url: "https://github.com/simon-zwicker/ZComNet.git")
],

集成

以下内容概述了你如何将此集成到你的项目中。这只是其中一种集成方式的示例。

Endpoint 枚举

import Foundation
import ZComNet

enum APIEndpoint: Endpoint {
    case todos
    case todo(UUID)
    
    // MARK: - Path
    var path: String {
        switch self {
        case .todos: "/todos"
        case .todo(let id): "/todos/\(id.uuidString)"
        }
    }

    // MARK: - RequestMethod
    var method: RequestMethod { .get }

    // MARK: - Headers
    var headers: [RequestHeader] { [.contentJson] }

    // MARK: - Parameters
    var parameters: [String : Any] { [:] }

    // MARK: - Encoding
    var encoding: Encoding { .url }
}

请求头

以下请求头已实现,如果需要更多功能,请随时联系。联系方式将在 Readme 末尾找到。

cookie // Cookie
contentJson // Content-Type: application/json
authBearer(authToken) // Authorization: Bearer [authToken]
正在开发中

可重用请求

我使用可重用请求,所以我创建了一个带有泛型的 Network 类。

API 配置结构体

import Foundation
import ZComNet

struct MyAPI {

    // MARK: - Shared
    static let shared = MyAPI()

	// MARK: - Properties    
    private var components: URLComponents {
        var urlComponent = URLComponents()
        urlComponent.scheme = "http"
        urlComponent.host = "127.0.0.1"
        urlComponent.port = 8080
        urlComponent.path = "/api/v1"
        return urlComponent
    }

    // MARK: - API
    var api: ZComNet {
		.init(with: components, loglevel: .debug)
    }
}

你可以使用日志级别初始化 ZComNet,或者不使用日志级别初始化,则默认为 none。你可以随时设置日志级别。

以下示例展示了如何在上述实现中使用代码稍后设置日志级别

MyAPI.shared.api.loglevel = .debug

请求

import ZComNet

struct Request<T: Codable> {
    func request(_ endpoint: APIEndpoint) async -> Result<T, Error> {
        return await MyAPI.shared.api.request(endpoint, error: ErrorObject.self)
    }
}

ErrorObject.self 只是一个你可以创建的 Codable 结构体。错误是否可解码取决于 API。你可以随意命名,error 接受任何 Decodable 类型。

请求器

import ZComNet

struct Requester {

    static func request<T: Codable>(_ T: T.Type, endpoint: APIEndpoint) async throws -> T {
        let req = Request<T>()
        let result = await req.request(endpoint)

        switch result {
        case .success(let responseItem): return responseItem
        case .failure(let error): throw error.self
        }
    }
}

在 SwiftUI 中调用

在 OnAppear 中调用

import SwiftUI

struct ContentView: View {

    @State var todos: [TodoRM] = .init()

    var body: some View {
        VStack {
            List(todos, id: \.id) { todo in
                Text(todo.title)
            }
        }
        .onAppear {
            Task {
                guard let todos = try? await Requester.request([TodoRM].self, endpoint: .todos) else { return }
                self.todos = todos
            }
        }
    }
}

或者 task

.task {
	guard let todos = try? await Requester.request([TodoRM].self, endpoint: .todos) else { return }
	self.todos = todos
}

这些只是关于如何使用此框架的示例。你可以根据自己的需要来实现 :)

联系方式