- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已针对调用 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/
Amazon Java SDK 已将 AmazonS3Client 的构造函数标记为已弃用,取而代之的是某些 AmazonS3ClientBuilder.defaultClient()。但是,遵循建议
我正在尝试在 AWS EMR 上使用 AmazonS3ClientBuilder 的 defaultClient 以这种方式从 S3 存储桶中获取一些文件: S3Object fullObject =
例如如果我有代码 t := time.Now() http.Get("google.com") fmt.Println(time.Now().Sub(t)) 打印的持续时间是在响应正文的最后一个字节之
我已针对调用 AWS Lambda 的两个不同 REST API 学习了两个 API Gateway 教程。这是link Calc API,这是本文的主题。 在每种情况下,通过 AWS 控制台进行的测
我正在使用一个库 (gotwilio),它使用 http.Client 对象向服务器发出 http 请求: client := &http.Client{} 然而,这在 appengine 上失败并显
java.lang.RuntimeException:无法启动 Activity ComponentInfo{com.example.msgqueue3/com.example.msgqueue3.M
当我尝试使用 onesignal 环境在 golang App Engine 中实现推送通知时。但是我收到错误“http.DefaultTransport 和 http.DefaultClient 在
我是一名优秀的程序员,十分优秀!