Release CI Swift Platforms Swift Package Manager(https://swiftpackageindex.cn/javiermanzo/Harbor) CocoaPods Compatible

Harbor 是一个 Swift 库,它使用 async/await 提供了一种简单的方式来发起 API 请求。

目录

特性

要求

安装

您可以使用 CocoaPodsSwift Package Manager 将 Harbor 添加到您的项目中。

CocoaPods

将以下行添加到您的 Podfile

pod 'Harbor'

Swift Package Manager

将以下内容添加到您的 Package.swift 文件

dependencies: [
    .package(url: "https://github.com/javiermanzo/Harbor.git")
]

用法

配置

这提供了一种集中管理通用配置的方法。

默认 Header

您可以将默认 header 包含在每个请求中。

要配置默认 header

await Harbor.setDefaultHeaderParameters([
    "MY_CUSTOM_HEADER": "VALUE"
])

Auth Provider (授权提供者)

如果您需要处理身份验证,您可以实现 HAuthProviderProtocol。 使用 Harbor 类的 setAuthProvider 方法来设置身份验证提供程序。

您需要创建一个实现 HAuthProviderProtocol 的类

class MyAuthProvider: HAuthProviderProtocol {
    func getAuthorizationHeader() async -> HAuthorizationHeader {
        // Return a HAuthorizationHeader instance
    }
    
    func authFailed() async {
        // This method is called when the request receives a 401 status code
    }
}

之后,设置您的 Auth provider

await Harbor.setAuthProvider(MyAuthProvider())

如果请求类将 needsAuth 属性设置为 true,Harbor 将调用身份验证提供程序的 getAuthorizationHeader 方法来获取 HAuthorizationHeader 实例,以便在执行请求之前将其设置在 header 中。

自定义 URLSession

Harbor 允许您为您的请求设置自定义 URLSession,为高级配置提供灵活性,例如自定义缓存、超时设置或其他协议。

要设置自定义 URLSession,请使用 setCustomURLSession 方法

let customSession = URLSession(configuration: .default)
await Harbor.setCustomURLSession(customSession)

mTLS 支持

Harbor 支持 mutual TLS (mTLS),以增强 API 请求的安全性。 此功能允许客户端向服务器提供证书,确保客户端和服务器相互验证。

要设置 mTLS,请使用 setMTLS 方法

let mTLS = HmTLS(p12FileUrl: yourP12FileUrl, password: "yourPassword")
await Harbor.setMTLS(mTLS)

SSL Pinning (SSL 证书绑定)

Harbor 支持 SSL Pinning 以增强您的 API 请求的安全性。 SSL Pinning 确保客户端根据已知的固定证书检查服务器的证书,从而增加额外的安全层。

要配置 SSL Pinning,请使用 setSSlPinningSHA256 方法

let sslPinningSHA256 = "yourSHA256CertificateHash"
await Harbor.setSSlPinningSHA256(sslPinningSHA256)

Request Protocols (请求协议)

要使用 Harbor 发起请求,您需要创建一个实现以下协议之一的类。

HGetRequestProtocol

如果您想发送 GET 请求,请使用 HGetRequestProtocol 协议。

额外属性

HPostRequestProtocol

如果您想发送 POST 请求,请使用 HPostRequestProtocol 协议。

额外属性

HPatchRequestProtocol

如果您想发送 PATCH 请求,请使用 HPatchRequestProtocol 协议。

额外属性

HPutRequestProtocol

如果您想发送 PUT 请求,请使用 HPutRequestProtocol 协议。

额外属性

HDeleteRequestProtocol

如果您想发送 DELETE 请求,请使用 HDeleteRequestProtocol 协议。

HRequestWithResultProtocol

如果您想将响应解析为特定模型,请使用 HRequestWithResultProtocol 协议。 此协议要求您定义您期望在响应中出现的模型类型。

额外属性

Request Calling (请求调用)

创建请求类后,您可以使用 request 方法执行请求。

Task {
    let response = await MyRequestWithResult().request()
}

Response (响应)

HResponse

如果您使用的协议与 HGetRequestProtocolHRequestWithResultProtocol 不同,则调用 request() 的结果将是一个 HResponse 枚举。

switch response {
case .success:
    break
case .error(let error):
    break
}

HResponseWithResult

如果您使用 HGetRequestProtocolHRequestWithResultProtocol,则调用 request() 的结果将是一个 HResponseWithResult 枚举。

switch response {
case .success(let result):
    break
case .error(let error):
    break
}

Cancel Request (取消请求)

如果请求正在运行,您可以取消该请求的任务。 request() 将返回 cancelled 作为错误情况。

let task = Task {
    let response = await MyRequestWithResult().request()
}
task.cancel()

Debug (调试)

您可以使用 HDebugRequestProtocol 协议打印有关您的请求的调试信息。 在请求类中实现该协议。

class MyRequest: HRequestWithResultProtocol, HDebugRequestProtocol {
    var debugType: HDebugRequestType = .requestAndResponse
    
    // ...
}

debugType 定义您要在控制台中打印的内容。 选项为 nonerequestresponserequestAndResponse

当您的请求被调用时,您将在 Xcode 控制台中看到有关您的请求的信息。

JSON RPC

Harbor 还通过 HarborJRPC 包支持 JSON RPC。

安装

要使用 HarborJRPC,请将以下导入添加到您的文件中

import HarborJRPC

配置

Set URL (设置 URL)

使用此方法设置 JSON RPC 请求的 URL

HarborJRPC.setURL("https://api.example.com/")

Set JSON RPC Version (设置 JSON RPC 版本)

使用此方法设置 JSON RPC 版本

// It uses 2.0 as default 
HarborJRPC.setJRPCVersion("2.0")

Request Protocol (请求协议)

HJRPCRequestProtocol

如果您想发送 JRPC 请求,请使用 HJRPCRequestProtocol 协议。

属性

Response (响应)

要使用 HarborJRPC 配置请求,请创建一个实现 HJRPCRequestProtocol 的结构或类。 调用 request() 的结果将是一个 HJRPCResponse

switch response {
case .success(let result):
    break
case .error(let error):
    break
}

Mocks (模拟)

Harbor 允许您注册和管理 mock 以方便测试您的 API 请求。

HMock

使用 HMock 为您的请求声明 mock 响应。

属性

注册 Mock

要注册 mock,请使用 register(mock:) 方法。 这将允许您模拟响应而不是进行实际的 API 调用。

let mock = HMock(
    ///
)
await Harbor.register(mock: mock)

注册一个成功的 Mock

let jsonResponse = """
    { "name": "John Doe" }
"""
let mock = HMock(
    request: MyGetUsersRequest.self,
    statusCode: 200,
    jsonResponse: jsonResponse
)
await Harbor.register(mock: mock)

注册一个错误的 Mock

let mock = HMock(
    request: MyGetUsersRequest.self,
    statusCode: 401,
    error: .authNeeded
)
await Harbor.register(mock: mock)

仅在调试模式下使用 Mocks

您可以将 mock 配置为仅在 #DEBUG 中使用,从而防止它们影响生产环境。 默认值为true

await Harbor.setMocksOnlyInDebug(false)

删除特定 Mock

如果您需要删除特定的 mock,请使用 remove(mock:) 方法。

await Harbor.remove(mock: mock)

删除所有 Mocks

要清除所有注册的 mock,请使用 removeAllMocks() 方法。

await Harbor.removeAllMocks()

完整示例

下面是一个完整的示例,演示了如何使用 Harbor 设置和使用 mock

Task {
    let jsonResponse = """
        { "users": [{ "id": 1, "name": "Alice" }] }
    """
    let userMock = HMock(
        request: MyGetUsersRequest.self,
        statusCode: 200,
        jsonResponse: jsonResponse
    )

    // Register the mock
    await Harbor.register(mock: userMock)

    // Perform a request that will use the registered mock
    let response = await MyGetUsersRequest().request()
    switch response {
    case .success(let users):
        // You will receive the mocked response here
        print("Users:", users)
    case .error(let error):
        break
    }
}

Contributing (贡献)

如果您遇到任何问题,请提交 issue。 欢迎提交 Pull request

Author (作者)

Harbor 由 Javier Manzo 创建。

License (许可)

Harbor 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。