SwiftyRequest
是一个为 Swift 构建的 HTTP 客户端。
最新发布的 SwiftyRequest 基于 Swift-NIO 的 async-http-client
构建。
Codable
类型。最新版本的 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 请求中的以下参数
headerParameters
:构成请求消息头部的 HTTP 头部字段。credentials
:请求的 HTTP 身份验证凭据。acceptType
:HTTP Accept
头部,默认为 application/json
。messageBody
:请求的 HTTP 消息体。productInfo
:HTTP User-Agent
头部。circuitParameters
:一个 CircuitParameters
对象,其中包含对后备函数的引用,该后备函数将在断路器快速失败时被调用(请参阅 断路器集成)。contentType
:HTTP Content-Type header
,默认为 application/json
。method
:请求中指定的 HTTP 方法,默认为 .GET
。queryItems
:要附加到 URL 的任何查询参数。我们收到的 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
对象并创建一个 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 提供了额外的便利方法,您可以根据预期的响应正文类型使用这些方法
responseData
要求响应包含正文,并使用 Result<RestResponse<Data>, Error>
回调。responseObject<T: Decodable>
将响应正文解码为指定的类型,并使用 Result<RestResponse<T>, Error>
回调。responseString
将响应正文解码为 String,并使用 Result<RestResponse<String>, Error>
回调。responseDictionary
将响应正文解码为 JSON,并使用 Result<RestResponse<[String: Any]>, Error>
回调。responseArray
将响应正文解码为 JSON 数组,并使用 Result<RestResponse<[Any]>, Error>
回调。responseVoid
不期望响应正文,并使用 Result<HTTPClient.Response, Error>
回调。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 版本相比,SwiftyRequest v3 中的 API 有许多更改
RestRequest
初始化程序参数 containsSelfSignedCert
已重命名为 insecure
,以更好地反映其用途(关闭 SSL 证书验证)。旧名称已被弃用,可能会在未来的版本中删除。responseData
(等)的 completionHandler
回调已从 (RestResponse<Data>) -> Void
更改为 (Result<RestResponse<Data>, RestError>) -> Void
。JSONDecodable
和 JSONEncodable
类型已被删除,改为直接使用 Codable
。 responseObject
函数允许您在响应中接收 Codable 对象。responseDictionary
和 responseArray
允许分别检索 JSON 作为 [String: Any]
和 [Any]
,并且可以通过设置 request.messageBodyDictionary
或 request.messageBodyArray
属性来执行原始 JSON 的发送。RestError
类型现在在 .failure
case 中显式返回。如果错误与具有非成功状态代码的响应有关,您可以使用 error.response
访问响应。如果响应还包含正文数据,则可以通过 error.responseData
检索它。创建 RestRequest
时指定 ClientCertificate
以启用在安全请求时呈现客户端证书(双向 SSL)。
证书可以以 PEM 格式提供 - 可以来自文件、字符串或 Data,以及可选的密码。PEM 数据应包含证书及其对应的私钥。如果私钥已加密,则应在构造 ClientCertificate 时指定相应的密码。
如果您需要处理其他格式的证书,您可以直接从 NIOSSLCertificate
和 NIOSSLPrivateKey
创建 ClientCertificate。有关这些类型的更多信息,请参阅 async-http-client
项目的文档。
有关更多信息,请访问我们的 API 参考。
我们喜欢讨论服务器端 Swift 和 Kitura。加入我们的 Slack 与团队会面!
此库在 Apache 2.0 许可下获得许可。完整许可文本可在 LICENSE 中找到。