我正在努力应对AWS Lambda和API网关。我可以通过curl
和Postman调用我的API,但不能从浏览器中调用。
这有效
curl --header "Content-Type: application/json" \
--request POST \
--data '{ "baseId" : "app0ZJgZxm6LC8rBB", "tableName": "Stories", "action": "select" }' \
'https://gpzy1rrcwg.execute-api.us-east-1.amazonaws.com/Prod/'
这不起作用(link to run it on CodePen)
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("button").click(function(){
$.ajax({
type: 'POST',
url: 'https://gpzy1rrcwg.execute-api.us-east-1.amazonaws.com/Prod/',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({
"baseId" : "app0ZJgZxm6LC8rBB",
"tableName": "Stories",
"action": "select"
}),
success: function (response) {
console.log(response)
alert('it worked')
},
error: function (err) {
console.log(err)
alert('it failed')
}
});
});
});
</script>
</head>
<body>
<button>Test</button>
</body>
</html>
答案 0 :(得分:3)
这可能是一个CORS问题,如@Rup在评论中所述。在.ajax()的contentType
选项的JQuery documentation中,您将看到:
对于跨域请求,将内容类型设置为application / x-www-form-urlencoded,multipart / form-data或text / plain之外的任何类型,都会触发浏览器向服务器发送预检OPTIONS请求
通过检查浏览器上的“网络”标签,您会看到它正在发送OPTION
请求。实际上,只需删除contentType
参数,您的代码即可按预期运行。
答案 1 :(得分:0)
什么是API网关和Lambda之间的集成模式- 是基于代理还是较早的代理??
您是否已在API网关方法中启用CORS。? https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html