gpt4 book ai didi

swift - AWS API Gateway 生成的 iOS SDK 缺少必需的 'defaultClient' 成员

转载 作者:行者123 更新时间:2023-11-30 10:48:11 26 4
gpt4 key购买 nike

我已针对调用 AWS Lambda 的两个不同 REST API 学习了两个 API Gateway 教程。这是link Calc API,这是本文的主题。

在每种情况下,通过 AWS 控制台进行的测试调用都能完美运行。但是,当我从部署阶段的“SDK Generation”选项卡生成 iOS Swift SDK 时,解压缩并导入到我的 Xcode 项目中,defaultClient <API-Name>Client.swift 中缺少成员.

每种情况下的 README.md 文件都表明它应该存在:

# Use the SDK in your project

1. Grab the `defaultClient` from your code

let client = <API-Name>Client.defaultClient()

1. You can now call your method using the client SDK

但是没有defaultClient<API-Name>Client.swift .

更新没有defaultClient ,但是有一个default (用反引号括起来,因为 default 是 Swift 中的保留字)。所以我在 REST API 调用中替换了它......并且它起作用了!我不知道为什么......我不知道反引号在 Swift 中意味着什么......如果有人可以向我解释这一点,那就太好了。但我通过API Gateway验证API调用成功;我通过 Cloudwatch 验证了 Lambda 函数返回了正确的值。

这是我调用 API 的代码:

@IBAction func userInvokeApi(_ sender: UIButton) {
print("You clicked invoke api...")
let client = SVTLambdaGateClient.default()
client.calcGet(operand2: "3", _operator: "+", operand1: "5").continueWith{ (task: AWSTask?) -> AnyObject? in
if let error = task?.error {
print("Error occurred: \(error)")
return nil
}

if let result = task?.result {
// Do something with result
print("The result is... \(result)")
}

return nil
}
}

但是,我还不明白客户端返回的数据结构。这是我得到的:

You clicked invoke api...
The result is... <AmplifyRestApiTest.Empty: 0x600002020770> {
}

以下是生成的 <API-Name>Client.swift 的完整内容文件(删除了一些注释)。我认为 README 可能不再与 SDK 生成同步。

import AWSCore
import AWSAPIGateway

public class SVTLambdaGateClient: AWSAPIGatewayClient {

static let AWSInfoClientKey = "SVTLambdaGateClient"

private static let _serviceClients = AWSSynchronizedMutableDictionary()
private static let _defaultClient:SVTLambdaGateClient = {
var serviceConfiguration: AWSServiceConfiguration? = nil
let serviceInfo = AWSInfo.default().defaultServiceInfo(AWSInfoClientKey)
if let serviceInfo = serviceInfo {
serviceConfiguration = AWSServiceConfiguration(region: serviceInfo.region, credentialsProvider: serviceInfo.cognitoCredentialsProvider)
} else if (AWSServiceManager.default().defaultServiceConfiguration != nil) {
serviceConfiguration = AWSServiceManager.default().defaultServiceConfiguration
} else {
serviceConfiguration = AWSServiceConfiguration(region: .Unknown, credentialsProvider: nil)
}

return SVTLambdaGateClient(configuration: serviceConfiguration!)
}()

/**
Returns the singleton service client. If the singleton object does not exist, the SDK instantiates the default service client with `defaultServiceConfiguration` from `AWSServiceManager.defaultServiceManager()`. The reference to this object is maintained by the SDK, and you do not need to retain it manually.
@return The default service client.
*/

public class func `default`() -> SVTLambdaGateClient{
return _defaultClient
}

/**
Creates a service client with the given service configuration and registers it for the key.
@param configuration A service configuration object.
@param key A string to identify the service client.
*/

public class func registerClient(withConfiguration configuration: AWSServiceConfiguration, forKey key: String){
_serviceClients.setObject(SVTLambdaGateClient(configuration: configuration), forKey: key as NSString);
}

/**
Retrieves the service client associated with the key. You need to call `registerClient(withConfiguration:configuration, forKey:)` before invoking this method or alternatively, set the configuration in your application's `info.plist` file. If `registerClientWithConfiguration(configuration, forKey:)` has not been called in advance or if a configuration is not present in the `info.plist` file of the app, this method returns `nil`.
Then call the following to get the service client:

let serviceClient = SVTLambdaGateClient.client(forKey: "USWest2SVTLambdaGateClient")

@param key A string to identify the service client.
@return An instance of the service client.
*/
public class func client(forKey key: String) -> SVTLambdaGateClient {
objc_sync_enter(self)
if let client: SVTLambdaGateClient = _serviceClients.object(forKey: key) as? SVTLambdaGateClient {
objc_sync_exit(self)
return client
}

let serviceInfo = AWSInfo.default().defaultServiceInfo(AWSInfoClientKey)
if let serviceInfo = serviceInfo {
let serviceConfiguration = AWSServiceConfiguration(region: serviceInfo.region, credentialsProvider: serviceInfo.cognitoCredentialsProvider)
SVTLambdaGateClient.registerClient(withConfiguration: serviceConfiguration!, forKey: key)
}
objc_sync_exit(self)
return _serviceClients.object(forKey: key) as! SVTLambdaGateClient;
}

/**
Removes the service client associated with the key and release it.

@param key A string to identify the service client.
*/
public class func removeClient(forKey key: String) -> Void{
_serviceClients.remove(key)
}

init(configuration: AWSServiceConfiguration) {
super.init()

self.configuration = configuration.copy() as! AWSServiceConfiguration
var URLString: String = "https://<my-api-id>.execute-api.us-east-2.amazonaws.com/test"
if URLString.hasSuffix("/") {
URLString = URLString.substring(to: URLString.index(before: URLString.endIndex))
}
self.configuration.endpoint = AWSEndpoint(region: configuration.regionType, service: .APIGateway, url: URL(string: URLString))
let signer: AWSSignatureV4Signer = AWSSignatureV4Signer(credentialsProvider: configuration.credentialsProvider, endpoint: self.configuration.endpoint)
if let endpoint = self.configuration.endpoint {
self.configuration.baseURL = endpoint.url
}
self.configuration.requestInterceptors = [AWSNetworkingRequestInterceptor(), signer]
}

/*


@param operand2
@param _operator
@param operand1

return type: Empty
*/
public func calcGet(operand2: String, _operator: String, operand1: String) -> AWSTask<Empty> {
let headerParameters = [
"Content-Type": "application/json",
"Accept": "application/json",

]

var queryParameters:[String:Any] = [:]
queryParameters["operand2"] = operand2
queryParameters["operator"] = _operator
queryParameters["operand1"] = operand1

let pathParameters:[String:Any] = [:]

return self.invokeHTTPRequest("GET", urlString: "/calc", pathParameters: pathParameters, queryParameters: queryParameters, headerParameters: headerParameters, body: nil, responseClass: Empty.self) as! AWSTask<Empty>
}


/*


@param body

return type: Empty
*/
public func calcPost(body: SVTInput) -> AWSTask<Empty> {
let headerParameters = [
"Content-Type": "application/json",
"Accept": "application/json",

]

let queryParameters:[String:Any] = [:]

let pathParameters:[String:Any] = [:]

return self.invokeHTTPRequest("POST", urlString: "/calc", pathParameters: pathParameters, queryParameters: queryParameters, headerParameters: headerParameters, body: body, responseClass: Empty.self) as! AWSTask<Empty>
}


/*


@param operand2
@param _operator
@param operand1

return type: SVTResult
*/
public func calcOperand1Operand2OperatorGet(operand2: String, _operator: String, operand1: String) -> AWSTask<SVTResult> {
let headerParameters = [
"Content-Type": "application/json",
"Accept": "application/json",

]

let queryParameters:[String:Any] = [:]

var pathParameters:[String:Any] = [:]
pathParameters["operand2"] = operand2
pathParameters["operator"] = _operator
pathParameters["operand1"] = operand1

return self.invokeHTTPRequest("GET", urlString: "/calc/{operand1}/{operand2}/{operator}", pathParameters: pathParameters, queryParameters: queryParameters, headerParameters: headerParameters, body: nil, responseClass: SVTResult.self) as! AWSTask<SVTResult>
}

非常感谢任何帮助!

最佳答案

Amplify 团队(维护和开发 AWS iOS SDK)验证 documentation is incorrect 。它应该引用 default() 而不是 defaultClient()

关于swift - AWS API Gateway 生成的 iOS SDK 缺少必需的 'defaultClient' 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55329768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com