问题描述
在我的 iOS 项目中,我需要实现 AWS 开发工具包,就像我在该项目的 Android 版本中成功所做的那样,如果可能的话,使用 Swift Package Manager 而不是 Cocoapods。
由于它似乎还不适用于 SPM,我尝试了 Soto,它允许我使用 SPM 实现 AWS 开发工具包。
这是我在我的 Android 项目中所做的,我想在 iOS 上复制:
- 我创建了一个
AWSInterface
接口,其中我的所有 api 端点是:
@Service(endpoint = "https://abcde12345.execute-api.eu-central-1.amazonaws.com/dev")
interface AWSInterface
{
@Operation(path = "/api-demo",method = "POST")
fun apiDemo(
@Parameter(name = "Content-Type",location = "header") contentType: String,body: ApiDemoModel): RetourStatutWS
}
- 这里是
ApiDemoModel
,非常简单:
class ApiDemoModel(val code: String)
class AWSInterfaceHolder {
var awsInterface: AWSInterface = apiclientFactory()
.credentialsProvider(AWSMobileClient.getInstance())
.clientConfiguration(ClientConfiguration().withConnectionTimeout(30000))
.build(AWSInterface::class.java)
}
- 我初始化了
AWSMobileClient
,并调用了我的 api:
AWSMobileClient.getInstance().initialize(
applicationContext,object : Callback<UserStateDetails> {
override fun onResult(result: UserStateDetails?) {
// AWSMobileClient is successfully initialized,I can call my api:
val awsInterfaceHolder = AWSInterfaceHolder()
awsInterfaceHolder.awsInterface.apiDemo(
"application/json",ApiDemoModel("123456"))
}
override fun onError(e: Exception?) {
e.printstacktrace()
}
}
如果可能,如何使用 Soto 对我的 iOS Swift 项目执行相同的操作,因为默认的 AWS 开发工具包尚不可用于 SPM?
谢谢。
解决方法
Soto 没有为 APIGateway 生成任何代码,但如果您希望签署 APIGateway REST 接口的请求,您可以执行以下操作。该代码使用了 swift-server AsyncHTTPClient,但它应该很容易将 signHeaders
的结果转换为 URLRequest
以与 URLSession
一起使用。
import SotoSignerV4
func apiGatewayExecute(
url: URL,method: HTTPMethod,headers: HTTPHeaders,body: ByteBuffer? = nil
) -> EventLoopFuture<HTTPClient.Response> {
let credentials: Credential = StaticCredential(
accessKeyId: "_MYACCESSKEY_",secretAccessKey: "_MYSECRETACCESSKEY_"
)
let signer = AWSSigner(credentials: credentials,name: "execute-api",region: "us-east-1")
// clean up URL
let processedURL = signer.processURL(url: url)!
let signedHeaders = signer.signHeaders(
url: processedURL,method: method,headers: headers,body: body.map { .byteBuffer($0) }
)
let request = try! HTTPClient.Request(
url: processedURL,headers: signedHeaders,body: body.map { .byteBuffer($0) }
)
return httpClient.execute(request: request,logger: logger)
}