首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SOTO在iOS上调用(API )?

如何使用SOTO在iOS上调用(API )?
EN

Stack Overflow用户
提问于 2021-02-02 12:17:33
回答 1查看 119关注 0票数 0

在我的iOS项目中,我需要实现AWS,就像我在该项目的Android版本中所做的那样,如果可能的话,可以使用而不是Cocoapods。

由于SPM似乎还没有可用,所以我尝试了佐藤,这允许我使用SPM实现AWS。

下面是我在我的安卓项目中所做的工作,我想在iOS上复制它:

  • 我创建了一个AWSInterface接口,其中我的所有api端点都是:
代码语言:javascript
复制
@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,非常简单:
代码语言:javascript
复制
class ApiDemoModel(val code: String)
  • 我创建了一个AWSInterfaceHolder类,因此我将能够调用apis:
代码语言:javascript
复制
class AWSInterfaceHolder {

    var awsInterface: AWSInterface = ApiClientFactory()
        .credentialsProvider(AWSMobileClient.getInstance())
        .clientConfiguration(ClientConfiguration().withConnectionTimeout(30000))
        .build(AWSInterface::class.java)
}
  • 我初始化了AWSMobileClient,并调用我的api:
代码语言:javascript
复制
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()
        }
}

如果可能的话,如何对我的iOS Swift项目进行同样的操作,因为默认的AWS还不能用于佐藤

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-02-03 14:53:16

Soto没有任何用于APIGateway的代码生成,但是如果您希望对APIGateway REST接口的请求签名,则可以执行以下操作。代码使用的是快速服务器AsyncHTTPClient,但是将signHeaders的结果转换为URLRequest以便与URLSession一起使用应该是非常容易的。

代码语言:javascript
复制
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,
        method: method,
        headers: signedHeaders,
        body: body.map { .byteBuffer($0) }
    )
    return httpClient.execute(request: request, logger: logger)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66009590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档