这是 Breeze Lambda API(自 0.2.0 版本起)的客户端。
将 BreezeLambdaAPIClient 作为依赖项添加到您的 Package.swift
的 dependencies 值中。
dependencies: [
//...
.package(url: "https://github.com/swift-serverless/BreezeLambdaAPIClient.git", from: "0.2.0"),
// ...
]
)
以下示例展示了如何使用客户端来创建、读取、更新、删除和列出项目。 Item
是一个符合 Codable
协议的结构体。 Item
必须在客户端和 Breeze Lambda API 之间共享。
import Foundation
import BreezeLambdaAPIClient
protocol ItemServing {
func create(item: Item) async throws -> Item
func read(key: String) async throws -> Item
func update(item: Item) async throws -> Item
func delete(item: Item) async throws
func list(startKey: String?, limit: Int?) async throws -> [Item]
}
struct ItemService: ItemServing {
private let apiClient: BreezeLambdaAPIClient<Item>
private let session: SessionService
private var token: String? {
session.userSession?.jwtToken
}
init(session: SessionService) {
guard var env = try? APIEnvironment.dev() else {
fatalError("Invalid Environment")
}
env.logger = Logger()
self.session = session
self.apiClient = BreezeLambdaAPIClient<Item>(env: env, path: "items", additionalHeaders: [:])
}
func create(item: Item) async throws -> Item {
try await apiClient.create(token: token, item: item)
}
func read(key: String) async throws -> Item {
try await apiClient.read(token: token, key: key)
}
func update(item: Item) async throws -> Item {
try await apiClient.update(token: token, item: item)
}
func delete(item: Item) async throws {
guard let updatedAt = item.updatedAt,
let createdAt = item.createdAt else {
throw ItemServiceError.invalidItem
}
try await apiClient.delete(token: token, key: item.key, createdAt: createdAt, updatedAt: updatedAt)
}
func list(startKey: String?, limit: Int?) async throws -> [Item] {
try await apiClient.list(token: token, exclusiveStartKey: startKey, limit: limit)
}
}
struct APIEnvironment {
static func dev() throws -> APIClientEnv {
try APIClientEnv(session: URLSession.shared, baseURL: "<API GATEWAY URL>", logger: nil)
}
}
extension Item: KeyedCodable {}
struct Logger: APIClientLogging {
func log(request: URLRequest) {
print(request)
}
func log(data: Data, for response: URLResponse) {
print(response)
let value = String(data: data, encoding: .utf8) ?? ""
print(value)
}
}
enum ItemServiceError: Error {
case invalidItem
}
注意:SessionService 用于获取 JWT 令牌。会话不属于此软件包的一部分。
非常欢迎大家做出贡献!请遵循此指南来做出贡献。