SmokeHTTP 是由 async-http-client 提供的通用 HTTP 客户端的专门化版本,它提供了将服务操作从底层 HTTP 协议抽象出来所需的通用功能。该库主要由 SmokeFramework 和 SmokeAWS 使用。
此库在 async-http-client 提供的功能之上提供了一些额外的功能:
HTTPRequestInputProtocol 和 HTTPResponseOutputProtocol 协议提供了一种机制,分别将输入类型解构为 HTTP 请求的不同组成部分,并从 HTTP 响应的组成部分构造输出类型。要使用 SmokeHTTPClient,用户可以使用实例化的委托 (HTTPClientDelegate, HTTPClientInvocationDelegate) 在其特定客户端的构造函数中实例化一个 HTTPOperationsClient,这些委托用于定义客户端特定的逻辑。
SmokeHTTP 遵循与 SmokeAWS 相同的支持策略,请点击此处查看。
SmokeHTTP 使用 Swift Package Manager。要使用该框架,请将以下依赖项添加到您的 Package.swift 中。
对于 swift-tools 版本 5.2 及更高版本
dependencies: [
.package(url: "https://github.com/amzn/smoke-http.git", from: "2.0.0")
]
.target(name: ..., dependencies: [
...,
.product(name: "SmokeHTTPClient", package: "smoke-http"),
]),
对于 swift-tools 版本 5.1 及更早版本
dependencies: [
.package(url: "https://github.com/amzn/smoke-http.git", from: "2.0.0")
]
.target(
name: ...,
dependencies: [..., "SmokeHTTPClient"]),
使用以下代码构造一个 HTTPClient
import SmokeHTTPClient
let httpOperationsClient = HTTPOperationsClient(endpointHostName: endpointHostName,
endpointPort: endpointPort,
contentType: contentType,
clientDelegate: clientDelegate,
connectionTimeoutSeconds: connectionTimeoutSeconds,
eventLoopProvider: = .createNew)
此构造函数的输入是
dynamodb.us-west-2.amazonaws.com。443。application/json。HTTPClientDelegate 协议的类型的实例。HTTPOperationsClient 上有多个 execute 调用的变体。 下面描述了一个变体,但所有变体都大致相似 -
try httpOperationsClient.executeAsyncRetriableWithOutput(
endpointOverride: nil,
endpointPath = endpointPath,
httpMethod: .GET,
input: InputType,
completion: completion,
asyncResponseInvocationStrategy: asyncResponseInvocationStrategy,
invocationContext: invocationContext,
retryConfiguration: retryConfiguration,
retryOnError: retryOnError)
此函数的输入是
HTTPRequestInputProtocol 协议的类型的实例。(Result<OutputType, HTTPClientError>) -> () 的闭包,用于处理调用的结果。 OutputType 必须是符合 HTTPResponseOutputProtocol 协议的类型。HTTPClientInvocationContext 的实例。HTTPClientRetryConfiguration 的实例,指示客户端应如何处理故障时的自动重试。(HTTPClientError) -> Bool 的闭包,可用于确定当请求因提供的错误而失败时是否应进行自动重试。HTTPOperationsClient.execute* 函数的完整变体列表是
executeAsyncRetriableWithOutput:异步地执行 HTTP 请求,内置支持自动重试,并且产生输出。executeAsyncRetriableWithoutOutput:同步地执行 HTTP 请求,内置支持自动重试,并且不产生输出。executeAsyncWithoutOutput:异步地执行 HTTP 请求,没有内置支持自动重试,并且不产生输出。executeAsyncWithOutput:异步地执行 HTTP 请求,没有内置支持自动重试,并且产生输出。executeSyncRetriableWithoutOutput:同步地执行 HTTP 请求,内置支持自动重试,并且不产生输出。executeSyncRetriableWithOutput:同步地执行 HTTP 请求,内置支持自动重试,并且产生输出。executeSyncWithoutOutput:同步地执行 HTTP 请求,没有内置支持自动重试,并且不产生输出。executeSyncWithOutput:同步地执行 HTTP 请求,没有内置支持自动重试,并且产生输出。HTTPClientDelegate 协议提供了多个扩展点,可用于自定义客户端。
协议函数要求
getResponseError:根据客户端的 HTTP 响应确定特定于客户端的错误。encodeInputAndQueryString:根据调用的输入确定用于 HTTP 请求的组件。decodeOutput:根据客户端的 HTTP 响应创建输出类型的实例。getTLSConfiguration:检索客户端要使用的 TLS 配置。HTTPClientDelegate 协议提供了多个扩展点,可用于自定义客户端的调用。
协议属性要求
specifyContentHeadersForZeroLengthBody:即使没有请求正文,是否也应在请求中发送 Content-Length 和 Content-Type 标头。协议函数要求
addClientSpecificHeaders:确定要添加到 HTTP 请求的任何其他标头。handleErrorResponses:根据客户端的 HTTP 响应确定特定于客户端的错误。如果返回非 nil 错误,则覆盖 HTTPClientDelegate.getResponseError。HTTPRequestInputProtocol 提供了一种机制,用于将输入转换为 HTTP 请求的不同部分。有关如何使用此协议将输入类型解构为 HTTP 请求的示例,请参见JSONAWSHttpClientDelegate.encodeInputAndQueryString()。
协议属性要求
queryEncodable:可选地,提供一个符合 Encodable 的类型的实例,该实例将用于生成 HTTP 请求的查询。pathEncodable:可选地,提供一个符合 Encodable 的类型的实例,该实例将用于为 HTTP 请求的路径提供任何标记化的值。bodyEncodable:可选地,提供一个符合 Encodable 的类型的实例,该实例将用于生成 HTTP 请求的正文。additionalHeadersEncodable:可选地,提供一个符合 Encodable 的类型的实例,该实例将用于生成 HTTP 请求的其他标头。pathPostfix:可选地,提供一个字符串,该字符串将在任何 token 被来自 pathEncodable 的值替换之前,添加到路径模板的末尾。HTTPResponseOutputProtocol 提供了一种从 HTTP 响应的组成部分构造输出类型的机制。 有关如何实现此目的的示例,请参见JSONAWSHttpClientDelegate.decodeOutput()。
协议函数要求
compose:一个接受 bodyDecodableProvider 和 headersDecodableProvider 闭包的函数,可用于从 HTTP 响应的各个部分构造预期输出类型的部分。HTTPClientInvocationContext 类型可用于自定义客户端的调用。
HTTPClientInvocationContext 构造函数的输入是
reporting:符合 HTTPClientInvocationReporting 协议的类型的实例。handlerDelegate:符合 HTTPClientInvocationDelegate 协议的类型的实例。HTTPClientInvocationReporting 协议提供了许多扩展点,重点是客户端调用的报告 -
协议属性要求
logger:用于与 HTTP 客户端调用相关的语句的记录器。internalRequestId:向客户端发出调用的请求的内部标识。traceContext:符合 InvocationTraceContext 协议的类型的实例。successCounter:可选地,一个 Metrics.Counter,它将记录客户端的成功调用。failure5XXCounter:可选地,一个 Metrics.Counter,它将记录客户端的不成功调用,这些调用返回 5xx 响应代码。failure4XXCounter:可选地,一个 Metrics.Counter,它将记录客户端的不成功调用,这些调用返回 4xx 响应代码。retryCountRecorder:可选地,一个 Metrics.Recorder,它将记录客户端调用的重试计数。latencyTimer:可选地,一个 Metrics.Recorder,它将记录来自客户端的调用的延迟。InvocationTraceContext 为请求级别跟踪提供了一个扩展点。
协议函数要求
handleOutwardsRequestStart:提供在请求发送之前处理客户端调用的能力,包括修改请求中发送的标头的能力。handleOutwardsRequestSuccess:提供在收到响应后立即处理成功调用的能力。handleOutwardsRequestFailure:提供在收到响应后立即处理不成功调用的能力。此库在 Apache 2.0 许可证下获得许可。