如何使用 SOTO 在 iOS 上调用 AWS 网络服务API 网关?

问题描述

在我的 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)
  • 我创建了一个 AWSInterfaceHolder 类,这样我就可以调用 apis:
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)
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...