一个轻量级的 WebService API,适用于 Apple 设备,使用 Swift 5.x 编写,并使用 结构化并发。它构建于 HTTPTypes 库之上,该库由 Apple 提供。
将以下依赖项子句添加到您的 Package.swift
// swift-tools-version:5.10
import PackageDescription
let package = Package(
name: "MyApp",
platforms: [.iOS(.v16), .tvOS(.v16), .macOS(.v12), .watchOS(.v9), .macCatalyst(.v16), .visionOS(.v1)],
products: [
.executable(name: "MyApp", targets: ["MyApp"])
],
dependencies: [
.package(url: "https://github.com/wmalloc/HTTPRequestable.git", from: "0.10.1")
],
targets: [
.target(name: "MyApp", dependencies:
[.product(name: "HTTPRequestable", package: "HTTPRequestable")])
]
)
协议 | 特性 |
---|---|
HTTPRequstable |
定义您的请求 |
HTTPTransferable |
创建您的 API 客户端 |
class HackerNews: HTTPTransferable, @unchecked Sendable {
var requestInterceptors: [any RequestInterceptor] = []
var responseInterceptors: [any ResponseInterceptor] = []
let session: URLSession
required init(session: URLSession = .shared) {
self.session = session
let logger = LoggerInterceptor()
requestInterceptors.append(logger)
responseInterceptors.append(logger)
}
func storyList(type: String) async throws -> StoryList.ResultType {
let request = try StoryListRequest(environment: environment, storyType: type)
return try await object(for: request, delegate: nil).value ?? []
}
}
struct StoryListRequest: HTTPRequestable {
typealias ResultType = [Int]
let environment: HTTPEnvironment
let headerFields: HTTPFields? = .init([.accept(.json)])
let queryItems: [URLQueryItem]? = [URLQueryItem(name: "print", value: "pretty")]
let path: String?
var responseDataTransformer: Transformer<Data, ResultType>? {
Self.jsonDecoder
}
init(environment: HTTPEnvironment, storyType: String) throws {
precondition(!storyType.isEmpty, "Story type cannot be empty")
self.environment = environment
self.path = "/\(storyType).json"
}
}
然后您可以创建并实例化您的 API 对象以进行调用
var api = HackerNews()
let topStories = try await api.storyList(type: "topstories.json")
HTTPRequestable 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。
如果您想支持这个项目,请考虑捐赠。
比特币: bc1qzxs3wk29vfxlr9e4frq9cdmgkvrp62m5xhm93l
以太坊: 0xa824353280d2A0F32b2d258904509EFAEaE6603d