微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Amplify 框架从 AWS 中的 API 获取 http 状态和详细响应? Amplify AndroidAmplify iOS

如何解决如何使用 Amplify 框架从 AWS 中的 API 获取 http 状态和详细响应? Amplify AndroidAmplify iOS

在我的 AWS 项目中,我使用 Lambda 和 API Gateway 创建了网络服务。 这些网络服务由我的 iOS 应用调用,使用 Amplify 框架。

在我的 lambda 函数中:

    return {
        statusCode: 200,body: JSON.stringify({
            "example_key_1": "example_value","example_key_2": 123456789
        })
    };
    return {
        statusCode: 400,body: JSON.stringify({
            "custom_error_code": 333333
        })
    };

在我的 iOS 应用中,我通过执行以下操作来调用我的 API:

    Amplify.API.post(request: request) { result in
        switch result
        {
            case .success(let data):
                print("success: \(data)")
            case .failure(let error):
                print("error: \(error)"
        }
    }

现在,这是我需要从 API 响应中获取的信息:

  • 出现错误时的状态码
  • 响应的正文,是否有错误

换句话说,当我调用 API 时,我需要在我的 iOS 应用中获取 lambda 的每个 return 的全部内容

根据 this 的说法,对于 Javascript 的 Amplify 框架似乎很容易实现,但我找不到适用于 iOS 或 Android 的等效框架。

如何使用 Amplify 框架实现这一目标?

谢谢。

解决方法

我在 iOS 项目中开发集成 API 网关时遇到了和你一样的问题。实际上,我为此提出了 PR。 Take a look.。不幸的是,他们关闭了那个 PR。但无论如何我开始在我的项目中使用我自己的 fork。已经上线2个月了。而且我没有遇到任何问题。

希望它会有所帮助。

,

Amplify Android

val body = JSONObject()
    .put("name","Mow the lawn")
    .toString()
    .toByteArray()
val request = RestOptions.builder()
    .addPath("/todo")
    .addBody(body)
    .build()

Amplify.API.post(request,{ response ->
        if (!response.code.isSuccessful()) {
            Log.w("TAG","non-200 return code")
        } else {
            val data = repsonse.data.asString()
            Log.i("Demo","OK! Data = $data")
        }
    },{ failure ->
        Log.e("Demo","No response from server",failure)
    }
)

Amplify iOS

let request = RESTRequest(path: "/todo",body: "my new Todo".data(using: .utf8))
Amplify.API.post(request: request) { result in
    switch result {
    case .success(let data):
        let str = String(decoding: data,as: UTF8.self)
        print("Success \(str)")
    case .failure(let apiError):
        switch apiError {
        case .httpStatusError(_,let response):
            println("\(response.statusCode)")
        else:
            println("No response from server")
        }
    }
}
,

从 1.7 版开始,您可以使用:

if case let .httpStatusError(statusCode,response) = error,let awsResponse = response as? AWSHTTPURLResponse {
 if let responseBody = awsResponse.body {
     print("Response contains a \(responseBody.count) byte long response body")
 }
}

如 PR #1076

中所述

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