我在AWS中创建了一个nodejs lambda函数,并使用方法GET,PUT,POST和DELETE(所有使用代理设置)使用APIGateway公开它。所有方法都已经过测试,并且使用APIGateway在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中允许任何内容的问题,但我可能是错的。我已经尝试过几乎所有事情,但似乎无法克服这个错误。
答案 0 :(得分:0)
我自己解决了这个问题。在API端口中为该端点允许所有日志输出之后,我发现我的标头被转换为全部小写的方式。
' IMAGEURL'成了' imageurl'
这是一个错误,因为在我的lambda函数中,它无法找到' imageUrl'
我认为这是在APIGateway中发生的转换,因为我从来没有遇到过swift这个问题。