如何使用 Amplify 框架从 AWS 中的 API 获取 http 状态和详细响应?
Posted
技术标签:
【中文标题】如何使用 Amplify 框架从 AWS 中的 API 获取 http 状态和详细响应?【英文标题】:How to get http status and detailed response from an API in AWS using the Amplify framework? 【发布时间】:2021-05-15 16:09:08 【问题描述】:在我的 AWS 项目中,我使用 Lambda 和 API Gateway 创建了 Web 服务。 这些网络服务由我的 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 框架实现这一目标?
谢谢。
【问题讨论】:
【参考方案1】:从 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")
如公关#1076中所述
【讨论】:
【参考方案2】:在 iOS 项目中开发集成 API 网关时,我遇到了和你一样的问题。实际上,我为此提出了 PR。 Take a look.。不幸的是,他们关闭了那个 PR。但无论如何,我开始在我的项目中使用我自己的fork。它已经直播了2个月。而且我没有遇到任何问题。
希望对您有所帮助。
【讨论】:
嗨,我刚刚检查了一下,他们用 AWSHTTPURLResponse 子类化 HTTPURLResponse(从 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")
【参考方案3】:
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")
【讨论】:
谢谢,但我不明白:对于 Amplify iOS,如果出现错误 400,我如何获取响应的正文?以上是关于如何使用 Amplify 框架从 AWS 中的 API 获取 http 状态和详细响应?的主要内容,如果未能解决你的问题,请参考以下文章
AWS Amplify in React,如何从订阅的侦听器呈现新数据
如何使用 aws-amplify 验证 node/express 中的 accessToken?
如何将 AWS Amplify 控制台中的现有应用程序与 AWS Amplify CLI 连接?
如何将 React 本机导航与 Android 中的 AWS Amplify 推送通知集成?