Kitura

APIDoc Build Status - Master macOS Linux Apache 2 Slack Status

SwiftyRequest

SwiftyRequest 是一个为 Swift 构建的 HTTP 客户端。

最新发布的 SwiftyRequest 基于 Swift-NIO 的 async-http-client 构建。

目录

特性

Swift 版本

最新版本的 SwiftyRequest 需要 Swift 5 或更高版本。

Swift 4 支持在 SwiftyRequest 的 2.x 版本中提供。

安装

要在您的 Swift 应用程序中利用 SwiftyRequest 包,您应该在 Package.swift 文件中为其指定依赖项

添加依赖项

SwiftyRequest 添加到应用程序的 Package.swift 文件中的 dependencies 中。将 "x.x.x" 替换为最新的 SwiftyRequest release

.package(url: "https://github.com/Kitura/SwiftyRequest.git", from: "x.x.x")

SwiftyRequest 添加到你的 target 的 dependencies 中

.target(name: "example", dependencies: ["SwiftyRequest"]),

用法

发起请求

要使用 SwiftyRequest 发起出站 HTTP 调用,请创建一个 RestRequest 实例。 method 参数是可选的(默认为 .get),url 参数是必需的。

RestRequest 的用法示例

import SwiftyRequest

let request = RestRequest(method: .get, url: "http://myApiCall/hello")
request.credentials = .basicAuthentication(username: "John", password: "12345")

您可以自定义 HTTP 请求中的以下参数

调用响应

我们收到的 result 对象类型为 Result<RestResponse<String>, Error>,因此我们可以执行 switch 以确定网络调用是否成功

request.responseString { result in
    switch result {
    case .success(let response):
        print("Success")
    case .failure(let error):
        print("Failure")
    }
}

使用模板参数调用响应

URL 可以使用 {keyName} 语法进行模板化,允许单个 RestRequest 实例与不同的参数重用。

在此示例中,我们使用两个模板参数调用响应方法,这些参数将用于替换 URL 中的 {state}{city}

let request = RestRequest(url: "http://api.weather.com/api/123456/conditions/q/{state}/{city}.json")

request.responseData(templateParams: ["state": "TX", "city": "Austin"]) { result in
	// Handle response
}

使用查询参数调用响应

在此示例中,我们使用查询参数调用响应方法,该参数将附加到幕后 url 上,以便 RestRequest 使用以下 url 执行:http://api.weather.com/api/123456/conditions/q/CA/San_Francisco.json?hour=9。请求 URL 中已指定的任何查询项都将被替换

let request = RestRequest(url: "http://api.weather.com/api/123456/conditions/q/CA/San_Francisco.json")

request.responseData(queryItems: [URLQueryItem(name: "hour", value: "9")]) { result in
	// Handle response
}

断路器集成

SwiftyRequest 具有内置功能,可以利用 CircuitBreaker 库来提高应用程序的稳定性。要使用此功能,请将 CircuitParameters 对象分配给 circuitParameters 属性。此对象将包含对后备函数的引用,该后备函数将在断路器快速失败时被调用。

后备

这是一个后备闭包的示例

let breakerFallback = { (error: BreakerError, msg: String) in
    print("Fallback closure invoked... circuit must be open.")
}

CircuitParameters

我们初始化 CircuitParameters 对象并创建一个 RestRequest 实例。您需要为 CircuitParameters 设置的唯一必需值是 fallback(其他所有内容都有默认值)。

let circuitParameters = CircuitParameters(timeout: 2000,
                                          maxFailures: 2,
                                          fallback: breakerFallback)

let request = RestRequest(method: .GET, url: "http://myApiCall/hello")
request.circuitParameters = circuitParameters

此时,您可以使用下面部分中提到的任何响应方法。

响应方法

RestRequest 提供了许多 response 函数,这些函数使用包含响应或错误的 Result 回调。

要调用请求并接收响应,您可以使用 response 函数。完成处理程序将使用类型为 Result<HTTPClient.Response, Error> 的结果回调。

RestRequest 提供了额外的便利方法,您可以根据预期的响应正文类型使用这些方法

处理响应的示例

let request = RestRequest(method: .get, url: "https://:8080/users/{userid}")

request.responseObject(templateParams: ["userid": "1"]) { (result: Result<RestResponse<User>, RestError>) in
    switch result {
    case .success(let response):
        let user = response.body
        print("Successfully retrieved user \(user.name)")
    case .failure(let error):
        if let response = error.response {
            print("Request failed with status: \(response.status)")
        }
        if let responseData = error.responseData {
            // Handle error response body
        }
    }
}

从 v2 迁移到 v3

与 v2 版本相比,SwiftyRequest v3 中的 API 有许多更改

客户端证书支持(双向 SSL)

创建 RestRequest 时指定 ClientCertificate 以启用在安全请求时呈现客户端证书(双向 SSL)。

证书可以以 PEM 格式提供 - 可以来自文件、字符串或 Data,以及可选的密码。PEM 数据应包含证书及其对应的私钥。如果私钥已加密,则应在构造 ClientCertificate 时指定相应的密码。

如果您需要处理其他格式的证书,您可以直接从 NIOSSLCertificateNIOSSLPrivateKey 创建 ClientCertificate。有关这些类型的更多信息,请参阅 async-http-client 项目的文档。

API 文档

有关更多信息,请访问我们的 API 参考

社区

我们喜欢讨论服务器端 Swift 和 Kitura。加入我们的 Slack 与团队会面!

许可证

此库在 Apache 2.0 许可下获得许可。完整许可文本可在 LICENSE 中找到。