一个 Swift 包,可以让你在 iOS、macOS 和其他 Apple 平台应用程序中更轻松、更可维护地进行网络请求。它提供了一个类型安全、清晰的 API,具有强大的功能,如环境切换、身份验证处理和 JSON 映射。
以下展示了使用 Networking 定义和使用 API 端点是多么容易
enum MyEndpoint {
case getUser(userId: String)
case updateProfile(name: String, email: String)
case createPost(threadId: String, post: Post)
}
extension MyEndpoint: Endpoint {
var baseURL: URL { URL(string: "https://your-api.com/api/v1")! }
var path: String {
switch self {
case let .getUser(userId): "/users/\(userId)"
case .updateProfile: "/users/me"
case .createPost: "/posts"
}
}
var method: HttpMethod {
switch self {
case .getUser: .get
case .updateProfile: .put
case .createPost: .post
}
}
var task: HttpTask {
switch self {
case .getUser:
return .none
case let .updateProfile(name, email):
return .rawBody([
"user_name": name,
"email_address": email
])
case let .createPost(threadId, post):
return .encodableBodyAndQuery(
body: post,
queryParameters: ["thread": threadId]
)
}
}
}
// Making requests
let controller = NetworkingController<MyEndpoint, MyError>()
do {
let user: User = try await controller.request(.getUser(userId: "123"))
// Handle the user data
} catch {
// Handle MyError
}
通过 Swift 包管理器将 Networking 添加到您的项目中
在 Xcode 中,转到 File > Swift Packages > Add Package Dependency。
输入仓库 URL
https://github.com/telemtobi/swift-networking.git
选择您喜欢的版本并完成。
轻松地在不同环境之间切换
// Configure with different environments
let controller = NetworkingController<MyEndpoint, MyError>(
environment: .live // For production
// or .test // For unit testing
// or .preview // For SwiftUI previews
)
// Works great with PointFree's Dependencies package
extension MyApiClient: DependencyKey {
static let liveValue = MyApiClient(environment: .live)
static let testValue = MyApiClient(environment: .test)
static let previewValue = MyApiClient(environment: .preview)
}
集成您的身份验证提供程序
class MyAuthenticator: Authenticator {
var state: AuthenticationState { .reachable }
func authenticate() async throws -> Bool {
// Your authentication logic
return true
}
func mapRequest(_ request: inout URLRequest) {
// Add auth headers, tokens, etc.
request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}
}
let controller = NetworkingController<MyEndpoint, MyError>(
authenticator: MyAuthenticator()
)
在解码之前转换 API 响应
struct User: Decodable, JsonMapper {
let id: String
let name: String
static func map(_ data: Data) -> Data {
// Transform response data if needed
return data
}
}
为每个端点或全局配置日志记录
// Per endpoint
extension MyEndpoint: Endpoint {
var shouldPrintLogs: Bool {
switch self {
case .sensitiveData: false
default: true
}
}
}
// Global configuration
Networking.DebugConfiguration.shouldPrintLogs = true
欢迎贡献!请随时提交 Pull Request。
本项目采用 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件。