使用API​​Gateway的POST API调用返回"内部服务器错误"在快速4,但在其他地方工作

时间:2018-02-10 18:51:35

标签: ios amazon-web-services lambda swift4 aws-api-gateway

我在AWS中创建了一个nodejs lambda函数,并使用方法GET,PUT,POST和DELETE(所有使用代理设置)使用API​​Gateway公开它。所有方法都已经过测试,并且使用API​​Gateway在AWS中工作,然后使用Postman在AWS之外。

首先,我在Swift 4项目中为端点调用了GET方法,并且它成功了。

但是我已经尝试了几乎所有在swift中调用POST方法的东西,并且无法让它成功执行。这是我在网上研究后正在尝试的内容:

let awsEndpoint: String = "https://host/path"
    guard let awsURL = URL(string: awsEndpoint) else {
        print("Error: cannot create URL")
        return
    }
    var postUrlRequest = URLRequest(url: awsURL)
    postUrlRequest.httpMethod = "POST"
    postUrlRequest.addValue("John Doe", forHTTPHeaderField: "name")
    postUrlRequest.addValue("imageurl.com", forHTTPHeaderField: "imageUrl")
    URLSession.shared.dataTask(with: postUrlRequest) { data, response, error in
        guard let data = data else { return }
        do {
            guard let receivedTodo = try JSONSerialization.jsonObject(with: data,
                                                                                      options: []) as? [String: Any] else {
                                                                                        print("Error")
                                                                                        return
                            }
        } catch let err{
            print(err)
        }
    }.resume()

我得到的回复是["消息":"内部服务器错误"]。当我查看CloudWatch中的日志时,它们不是很具描述性。邮件调用的错误日志是: "由于配置错误导致执行失败:格式错误的Lambda代理响应"

在研究了这个问题之后,aws建议以特定的方式格式化响应,并且我已经更新了我的nodejs lambda函数以模仿它。

    case "POST":
  pool.getConnection(function(err, connection) {
    const groupName = event.headers.name;
    const imageUrl = event.headers.imageUrl;
    var group  = {Name: groupName, ImageUrl: imageUrl, IsActive:true, Created:date, Updated:date};
    var query = "INSERT INTO Groups SET ?";
    connection.query(query,group, function (error, results, fields) {
      var responseBody = {
        "key3": "value3",
        "key2": "value2",
        "key1": "value1"
      };
      var response = {
        "statusCode": 200,
        "headers": {
          "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": true
      };
      if (error) callback(error);
      else callback(null, response)
      connection.release();
    });
  });
  break;

就像我之前说过的那样,除了swift 4以外的所有地方测试都有效。我的GET调用适用于swift 4,所以我不认为这是在info.plist中允许任何内容的问题,但我可能是错的。我已经尝试过几乎所有事情,但似乎无法克服这个错误。

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。在API端口中为该端点允许所有日志输出之后,我发现我的标头被转换为全部小写的方式。

' IMAGEURL'成了' imageurl'

这是一个错误,因为在我的lambda函数中,它无法找到' imageUrl'

我认为这是在APIGateway中发生的转换,因为我从来没有遇到过swift这个问题。