用于 Swift REST API 异步/等待调用的轻量级库
最低目标 | 操作系统 |
---|---|
16.0 | iOS |
13.0 | macOS |
你可以通过 Swift Package Manager 安装
前往你的项目设置 -> Swift Packages,插入此仓库的 GitHub 链接,然后点击 Add Package
不使用 Xcode 集成,你可以将以下内容添加到你的 Package.swift
文件中的 dependencies 中
dependencies: [
.package(url: "https://github.com/simon-zwicker/ZComNet.git")
],
以下内容概述了你如何将此集成到你的项目中。这只是其中一种集成方式的示例。
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 类。
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
}
}
}
在 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
}