【问题标题】:AWS CORS issue: Ajax response comes as Error even after getting 200 status codeAWS CORS 问题:即使在获得 200 状态代码后,Ajax 响应也会出现错误
【发布时间】:2017-05-04 12:59:49
【问题描述】:

我正在尝试在 ajax 的帮助下调用 API。

$.ajax({
        url:url,
        type: 'POST',
        data: JSON.stringify(data),
        dataType: 'json',
        async: false,
        success: function(data, statusText, xhr) {
            console.log("Calling success");
            console.log(arguments);
            console.log(data.status);
        },
        complete: function(data, statusText, xhr) {
            console.log("Calling Complete");
            console.log(arguments);
            console.log(data.status);
        },
        error: function(data, statusText, xhr) {
            console.log("Calling error");
            console.log(arguments);
            console.log(data.status);
        }
    });

调用 ajax 后,这是 firefox 中的响应:

您可以在图片中看到,我收到了200 statuscode,在响应中,我收到了我的 JSON 数据。

下面是调用ajax后的控制台截图。

下面是错误对象:

Object { readyState: 0, getResponseHeader: .ajax/v.getResponseHeader(), getAllResponseHeaders: .ajax/v.getAllResponseHeaders(), setRequestHeader: .ajax/v.setRequestHeader(), overrideMimeType: .ajax/v.overrideMimeType(), statusCode: .ajax/v.statusCode(), abort: .ajax/v.abort(), state: .Deferred/d.state(), always: .Deferred/d.always(), then: .Deferred/d.then(), 11 more… }

挖掘对象后发现的错误:

Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'url I passed in ajax'. at Object.send (https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js:4:14955) at Function.ajax (https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js:4:10579) at HTMLButtonElement.<anonymous> (http://mywebsitestatic.s3-website-us-west-2.amazonaws.com/:258:4) at HTMLButtonElement.dispatch (https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js:3:6404) at HTMLButtonElement.r.handle (https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js:3:3179)

任何想法是什么错误。

我尝试从 stackoverflow.com 引用许多问题,但没有一个与我的场景匹配。 谁能告诉我哪里出错了?

【问题讨论】:

  • API好像返回错误,你有权限访问服务端代码吗?
  • inspect 元素中的响应选项卡没有显示任何错误,实际上它显示了我们从响应中获取的数据。@robertc
  • 那么控制台中带有1: "error"属性的对象是什么?
  • 您调用的 URL 是否与托管网站的 URL 相同?如果不是,您可能会被同源策略阻止
  • @robertc 让我找到错误对象

标签: javascript jquery ajax amazon-web-services cors


【解决方案1】:

这是一个Cross Origin Resource Sharing (CORS) 问题。要修复它,如果可以,您必须在服务器中添加以下 2 个响应标头:

setHeader("Access-Control-Allow-Origin:", "origin url of your site");
setHeader("Access-Control-Allow-Methods", "GET, POST, PUT");

要确认这是CORS 问题,您可以通过在chrome 中通过此安全检查,方法是从下面的控制台打开它并试一试网址,

窗户:

chrome.exe --allow-file-access-from-files

chrome.exe --allow-file-access-from-files --disable-web-security

苹果机:

open /Applications/Google\ Chrome.app/ --args --allow-file-access-from-files

注意:修复方法是在您尝试从 JQuery POST 请求访问的服务器中设置上述响应标头。

启用 CORS 的 AWS 链接

http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

参考文献:(了解更多关于CORS

Cross Origin Request Sharing

Cross Origin Request Sharing

Same Origin Policy

【讨论】:

  • 我怀疑这个问题不仅在 Chrome 上,而且在所有浏览器上都存在。这是普遍问题吗?
  • 这是CORS 的安全问题,所有最新的浏览器都会阻止它。您应该在您调用的服务器中设置上述两个标头以允许访问。为了确认这是 CORS 问题,我告诉你从上面的控制台打开 chrome。
  • 我给了你更多的参考网址来了解CORS是什么,你可以参考一下。
  • 添加到服务器是什么意思?很抱歉问你这样的问题,但我在 AWS s3 上托管这个站点并使用 AWS API 网关和 AWS Lambda。真的不知道在哪里添加它。
  • 首先您应该通过参考我提供的 URL 来尝试了解 CORS 是什么。然后查看AWS 文档关于CORS 以及如何在那里添加上述标题。
猜你喜欢
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2013-12-28
  • 2018-12-23
  • 2013-09-08
  • 2021-04-01
相关资源
最近更新 更多