AWS Lambda和API网关-500来自浏览器,但不是来自curl

时间:2018-08-28 17:12:25

标签: javascript jquery rest aws-lambda aws-api-gateway

我正在努力应对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>

link to run it on CodePen

2 个答案:

答案 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