SwiftAPIClient
轻量级且设计简单的 Swift API 客户端,采用面向协议的编程方式编写。你可以使用 async await
或 Combine
发布者发送请求,而不需要做任何更改。 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()
}
}
使用异步发送请求
如前所述,端点自动处理 Combine
和 async
,因此您可以使用任一方法。例如,如果您想使用 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
}
然后将它作为验证器传送给您的端点,以替换默认的响应验证
贡献
欢迎贡献者。