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

如何解决如何使用 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)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?