Swift 网络请求

一个 Swift 包,可以让你在 iOS、macOS 和其他 Apple 平台应用程序中更轻松、更可维护地进行网络请求。它提供了一个类型安全、清晰的 API,具有强大的功能,如环境切换、身份验证处理和 JSON 映射。

Swift SPM License

特性

快速示例

以下展示了使用 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 包管理器

通过 Swift 包管理器将 Networking 添加到您的项目中

  1. 在 Xcode 中,转到 File > Swift Packages > Add Package Dependency

  2. 输入仓库 URL

    https://github.com/telemtobi/swift-networking.git
    
  3. 选择您喜欢的版本并完成。

使用

环境管理

轻松地在不同环境之间切换

// 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()
)

JSON 映射

在解码之前转换 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 文件。