SwiftyRequest
SwiftyRequest
是一个专为 Swift 构建的 HTTP 网络库。
SwiftyRequest
使用 URLSession
作为底层传输。由于 Linux 上的 URLSession
还没有完全实现,因此您可能会发现这个库在 Linux 上的可靠性不如 Darwin(参考 issue #24 和 #25,其中第二个参考了一个 Foundation PR)。
内容
特性
- 提供多种响应方法(例如 Data、Object、Array、String 等),以消除应用程序中的样板代码。
- JSON 编码和解码。
- 与 CircuitBreaker 库的集成。
- 身份验证令牌。
- 多部分表单数据。
Swift 版本
此仓库支持 Swift 4.0.3 及更高版本。
安装
要利用 Swift 应用程序中的 SwiftyRequest
包,您应该在您的 Package.swift
文件中指定对其的依赖关系
添加依赖项
将 SwiftyRequest
添加到您的应用程序 Package.swift
文件中的依赖关系里。用最新的 SwiftyRequest
版本 替换 "x.x.x"
。
.package(url: "https://github.com/IBM-Swift/SwiftyRequest.git", from: "x.x.x")
将 SwiftyRequest
添加到目标依赖关系中
.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 = .apiKey
您可以在 HTTP 请求中自定义以下参数
headerParameters
:构成请求消息头部部分的 HTTP 头字段。credentials
:请求的 HTTP 认证凭据。acceptType
:默认为 `application/json` 的 HTTPAccept
头。messageBody
:请求的消息正文。productInfo
:HTTPUser-Agent
头。:包含对在快速失败时将被调用的回退函数的引用的
CircuitParameters
对象(请参阅 Circuit Breaker 集成)。contentType
:默认为application/json
的 HTTPContent-Type header
。method
:请求中指定的 HTTP 方法,默认为 `.get`。
调用响应
在这个示例中,responseToError
只是一个错误处理函数。我们得到的response
对象类型为RestResponse<String>
,因此我们可以对response.result
进行切换操作,以确定网络调用是否成功。
request.responseString(responseToError: responseToError) { response in
switch response.result {
case .success(let result):
print("Success")
case .failure(let error):
print("Failure")
}
}
使用模板参数调用响应
在这个示例中,我们用一个模板参数调用响应方法,以替换url
中的{state}
和{city}
的值。这允许我们使用同一个RestRequest
对象创建多个响应调用,但可能使用不同的URL值。
let request = RestRequest(url: "http://api.weather.com/api/123456/conditions/q/{state}/{city}.json")
request.credentials = .apiKey
request.responseData(templateParams: ["state": "TX", "city": "Austin"]) { response 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.credentials = .apiKey
request.responseData(queryItems: [URLQueryItem(name: "hour", value: "9")]) { response in
// Handle response
}
断路器集成
SwiftyRequest
现在提供了利用断路器库的额外内置功能,以提高应用稳定性。要使用此功能,只需将一个CircuitParameters
对象提供给RestRequest
初始化器。一个CircuitParameters
对象将包含一个引用,指向在断路器快速失败时调用的回退函数。
回退
以下是一个回退闭包示例
let fallback = { (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: breakFallback)
let request = RestRequest(method: .get, url: "http://myApiCall/hello")
request.credentials = .apiKey,
request.circuitParameters = circuitParameters
此时,您可以使用以下章节中提到的任何响应方法。
响应方法
根据期望的结果类型,可以使用不同的响应方法,如下所述
responseData
返回一个Data
对象。responseObject<T: Codable>
返回一个类型为T
的可编码对象。responseObject<T: JSONDecodable>
返回一个类型为T
的对象。responseArray<T: JSONDecodable>
返回一个类型为T
的数组。responseString
返回一个String
。responseVoid
返回Void
。
API文档
更多信息请访问我们的API参考。
社区
我们热爱谈论服务器端Swift和Kitura。加入我们的Slack,结识我们的团队!
许可证
本库遵守Apache 2.0许可证。完整的许可证文本可在LICENSE中找到。