如何使用 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 推送通知集成?

如何在 aws amplify 中使用 graphQL 限制

AWS amplify add auth:如何在执行 amplify cli 后添加重定向登录 URI