全新的 Swift 和 iOS 开发(本周末开始学习)。
我正在尝试制作一个通用的 HTTP 客户端包装器,用于使用 和 对 API Gateway (AWS) 进行签名和发送SotoSignerV4
请求AsyncHTTPClient
。我遵循了一个很好的指南来获得一些关于如何实现这一点的样板想法,但是当我在单元测试(XCTestCase
)中测试这种方法时,它根本没有按预期工作。似乎请求甚至没有执行(事实上我知道它没有执行,因为我可以检查我的 Lambda 应用程序上的日志 - 请求没有到达 lambda)。
这是我的大部分代码:
private func request<TEntity: Codable>(
type: TEntity.Type,
body: Codable? = nil,
resource: String,
method: HTTPMethod) throws -> TEntity {
// A bunch of AWS Sig4 signing stuff happens here, already tested and working...
let timeout = HTTPClient.Configuration.Timeout(
connect: .seconds(30), read: .seconds(30))
let httpClient: HTTPClient = HTTPClient(
eventLoopGroupProvider: .createNew,
configuration: HTTPClient.Configuration(timeout: timeout))
var entity: TEntity? = nil;
var responseString: String? = nil;
let request = try! HTTPClient.Request(
url: processedUrl,
method: method,
headers: signedHeaders,
body: requestPayload)
let future = httpClient.execute(request: request)
future.whenComplete {
result in
switch result {
case .success(let response):
guard let responseBuffer = response.body, response.status == .ok
else { return }
let responseBody = Data(buffer: responseBuffer)
responseString = String(decoding: responseBody, as: UTF8.self)
case .failure(_):
return
}
}
try httpClient.syncShutdown()
entity = try! JSONDecoder().decode(TEntity.self, from: Data(responseString!.utf8));
return entity!;
}
失败在entity
分配线上,说明,
Fatal error: Unexpectedly found nil while unwrapping an Optional value: file MyFramework/AWSSignedClient.swift, line 158
它无法解包的可选选项是响应字符串,这意味着.success
案例中的代码从未被命中。我也尝试通过捕获表示错误的字符串来测试错误情况,但即使这样也不起作用。就好像与关联的回调 whenComplete
被完全跳过,请求永远不会被发出。我也尝试过使用URLSession.shared.dataTask
,结果相同 - 没有提出任何请求。
请帮忙!我在做什么错HTTPClient
?