【发布时间】:2017-03-19 11:25:34
【问题描述】:
所以我尝试使用 $.ajax() 调用将数据提交到 API 端点。我已验证我可以使用curl 命令进行 POST,格式如下:
curl -X POST -H "Content-Type: application/json" -d "{\"uname\":\"myusername2\",\"emailAddr\":\"user2@ex.com\"}" <url to my API endpoint>
curl 命令返回一个空的 JSON 响应(看起来像 {}),我的数据被放入数据库(这是我配置 API Gateway 端点要做的事情)。
但是,当我尝试使用 $.ajax() 命令执行此操作时,该命令被编程为在填写表单数据后触发单击的按钮,但我无法使其工作。
var obj = new Object();
obj.uname = $uname;
obj.emailAddr = $email;
var stringedObj = JSON.stringify(obj);
alert("stringified: " + stringedObj);
$.ajax({
url: '<same url as in curl>',
type: 'POST',
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(obj),
success: function(data) {
alert(JSON.stringify(data));
},
error: function(e) {
alert("failed" + JSON.stringify(e));
}
});
每当我运行此程序时,我都可以从第一条警报消息中看到我的数据已正确字符串化。但是,我总是收到如下所示的错误消息:
failed{"readyState":0,"responseText":"","status":0,"statusText":"error"}
我想知道是否可以获得更详细的错误响应。另外,我尝试过使用parseData: false 和crossdomain: true。再一次,当我使用 curl 时它可以工作,所以我很确定这不是 API 网关配置问题。
感谢您的所有帮助!
编辑:我从下面关于 javascript 控制台的评论中了解到。现在我发现这是由于未启用 CORS。我在 AWS Api Gateway 中启用了 CORS,等待它完成,然后将我的请求更改为:
$.ajax({
url: '<my url>',
type: 'POST',
data: JSON.stringify(obj),
dataType: 'json',
crossDomain: true,
success: function(data) {
alert(JSON.stringify(data));
},
error: function(e) {
alert("failed" + JSON.stringify(e));
}
});
我在 javascript 控制台中得到了关于需要 CORS 的相同响应。 Other threads on CORS have shown 以此为例。我想知道是否需要自定义标头,尽管我尝试添加 headers: { "Access-Control-Allow-Origin": "*" } 并且仍然从 javascript 控制台得到相同的响应:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://k6i6wk8487.execute-api.us-west-2.amazonaws.com/prod/comments. (Reason: CORS header 'Access-Control-Allow-Origin' missing).
【问题讨论】:
-
Javascript 控制台有错误吗?比如不允许跨域的错误?
-
我同意@Barmar - CORS ...
-
@Barmar 感谢您的提示!是的,我发现 CORS 被拒绝,所以我在 API 网关中启用了它。但是,我仍然收到标题 Access-Control-Allow-Origin 丢失的消息。我添加了 crossDomain: true 和 dataType: 'json' set,我从 javascript 控制台收到了相同的错误消息。 StackOverflow 上的其他线程说添加这两个选项是所有必要的。我是否需要添加自定义标题,如果需要怎么办?我尝试使用标题:{“Access-Control-Allow-Origin”:“*”},但这也没有帮助。再次感谢
-
Access-Control-Allow-Origin: "*"需要在端点设置,而不是通过您的 Ajax 请求。 -
Access-Control-Allow-Origin标头需要在您的 AWS 服务器上配置。虽然@amdouglas 提供了一个选项来指定这一点,但我建议您将该标头锁定到单个必要的域作为额外的安全措施(即Access-Control-Allow-Origin: http://www.example.com),而不是对所有域进行通配符...跨度>
标签: jquery ajax curl cors aws-api-gateway