使用生成的SDK(Swift)进行AWS API网关错误处理

时间:2017-08-07 04:07:17

标签: swift aws-api-gateway

我对AWS并使用API Gateway -> Lambda -> RDS相当新。另外,我在SDK移动应用程序中使用生成的iOS用于使用API的<{1}}。

直接路径在返回成功时工作正常(200)。但是,我试图为边缘情况添加更多错误处理。如果API请求找不到预期的资源,我会尝试返回404 error。我已经适当地将此添加到API集成响应和方法响应中。我可以对此进行测试,并按预期返回错误模型以及正确的HTTP Status code of 404

但是,我正在努力解决如何在移动应用程序方面处理这个问题。如何由生成的SDK处理?它只是在API调用中抛出错误,我期望找到一种方法来检索我的&#34;错误&#34;我定义的模型对象。

Here is normal path

Here is failed path with 404

生成的SDK(Swift)方法:

public func userUseridentityGet(useridentity: String) -> AWSTask<RSAPI_UserModel> {
let headerParameters = [
    "Content-Type": "application/json",
    "Accept": "application/json",           
]

let queryParameters:[String:Any] = [:]

var pathParameters:[String:Any] = [:]
pathParameters["useridentity"] = useridentity

return self.invokeHTTPRequest("GET", urlString: "/user/{useridentity}", pathParameters: pathParameters, queryParameters: queryParameters, headerParameters: headerParameters, body: nil, responseClass: RSAPI_UserModel.self) as! AWSTask<RSAPI_UserModel>
}

在运行时,当我打印错误时,我得到以下注销:

  

发生错误:错误   Domain = com.amazonaws.AWSAPIGatewayErrorDomain Code = 1&#34;(null)&#34;   的UserInfo = {HTTPBody = {       代码= 404;       message =&#34;未找到结果。&#34 ;;       &#34;请求-ID&#34; =&#34; 132b8eaa-7b24-11e7-b1fd-d342f0413b7d&#34 ;;       type = NotFound; },HTTPHeaderFields = {type = immutable dict,count = 8,entries =&gt; 0:   x-cache = {contents =&#34;错误   来自cloudfront&#34;} 1:Content-Type = {contents =&#34; application / json&#34;} 3:x-amzn-requestid =   {contents =   &#34; 131a5075-7b24-11e7-87bd-9fcb4cb4e04e&#34;} 4:Via = {contents =&#34; 1.1   bd4761ff0774f9ee778140b91a0431c9.cloudfront.net(CloudFront)&#34;} 6:   日期= {contents =&#34;星期一,8月7日   2017 03:54:13 GMT&#34;} 10:Content-Length = 134 11:x-amzn-trace-id =   {contents =   &#34;采样= 0; root = 1-5987e464-d3d8f7801b7ae5aa6a52fc1b&#34;} 12:   x-amz-cf-id = {contents =   &#34; QKpl64W1qDaeo0zlsx2iOwTW0oO_jyPRmMT7ByPKLnen04qiPEeD6w ==&#34;}}}

问题是如何将反序列化到我的&#34;错误&#34;我定义的对象模型?如何正确检测此错误情况,以便我可以在移动应用程序中编写逻辑来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

对于解决方法,我只是通过手动提取数据来处理这个问题。如果有人有更好的方法来解决这个问题。我一定很感兴趣。

if let error = task?.error as NSError? {
    print("Error occurred: \(error)")
    if error.code == 1 {
        let httpBody : NSDictionary = (error.userInfo["HTTPBody"] as? NSDictionary)!
        print("Code \(httpBody["code"] ?? "none") - Type \(httpBody["type"] ?? "none") - Message \(httpBody["message"] ?? "none") - RequestID \(httpBody["request-id"] ?? "none")")
    }
    return nil
}