【问题标题】:Failed cross domain xml Get Request跨域xml获取请求失败
【发布时间】:2020-09-01 20:08:28
【问题描述】:

我试图帮助一个朋友完成一个程序,但我的编码经验有些过时(10 年的付出或接受)。试图通过他们的 API 从数据库中提取数据的地方。我通过 XMLhttpRequest 发出此请求,但我什至在访问服务器时遇到问题。

发生的错误:

Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost/jasper/api.shiftbase.com/api/rosters?min_date=2020-07-13&max_date=2020-12-31&department_id=24477

它试图在我自己的域上搜索 url。但我需要它来搜索跨域。

整个函数:

function getRequest(){
    var _request = new XMLHttpRequest();
    var key = myKeyHere;
    var url = "api.shiftbase.com/api/rosters?min_date=2020-07-13&max_date=2020-12-31&department_id=24477";
    _request.onreadystatechange = function(event){
    console.log(_request.readyState + " + " + _request.status);
        if (_request.readyState == 4){
            if ((_request.status >= 200 && _request.status < 300) || _request.status == 304){
                alert(_request.responseText);
            } else {
                    alert('Request was unsucceful: ' + _request.status);
            }
        }
    };
    _request.open("get", url, true);
    _request.setRequestHeader("Accept", "application/JSON", false);
    _request.setRequestHeader("Content-Type", "application/JSON", false);
    _request.setRequestHeader("Authorization", key, false);
    _request.send(null);
};  

我还阅读了很多关于 CORS 以及它如何影响这些跨域请求的内容,但我不太了解它是如何工作的以及如何围绕它工作。

感谢任何帮助。

【问题讨论】:

  • 你的 URL 需要一个 https:// 前缀
  • 之前也试过了(应该在我最初的帖子中说),但后来我得到一个 ERR_HTTP_PROTOCOL_ERROR。知道那是什么吗?
  • 这可能是因为您的标题中有无效字符。 application/JSON 应该是 application/json。从我可以从quick search 中找到的是,您的 API KEY 应采用以下格式 API [your key]
  • Tnx,似乎 cappital 中的 JSON 是问题 /facepalm。关于钥匙。我正在使用该设置,但不想将我的密钥放在互联网上以防万一^^。非常感谢。

标签: javascript cors


【解决方案1】:

首先,您需要在您的 URL 前加上 https://。这样您就可以向外部服务器而不是 localhost 发出请求。第二件事是,在您的标题中,application/JSON 应该是 application/json

另外不要忘记您的密钥必须是带有“API”的prefixed。示例API [some_random_key]

我已经测试了下面的代码并且它工作正常。您只需添加自己的 API KEY。

function getRequest(){
    var _request = new XMLHttpRequest();
    var key = "API [replace_this_with_your_key]"; // Example: "API a1b2c3d4e5f6g7h8i9"
    var url = "https://api.shiftbase.com/api/rosters?min_date=2020-07-13&max_date=2020-12-31&department_id=24477";
    _request.onreadystatechange = function(event){
    console.log(_request.readyState + " + " + _request.status);
        if (_request.readyState == 4){
            if ((_request.status >= 200 && _request.status < 300) || _request.status == 304){
                alert(_request.responseText);
            } else {
                    alert('Request was unsucceful: ' + _request.status);
            }
        }
    };
    _request.open("get", url, true);
    _request.setRequestHeader("Accept", "application/json", false);
    _request.setRequestHeader("Content-Type", "application/json", false);
    _request.setRequestHeader("Authorization", key, false);
    _request.send(null);
};

【讨论】:

    【解决方案2】:

    如果您想向外部服务器发出请求,请尝试在 url 变量声明(第 4 行)的行首添加 //

    您的请求已发送至本地网络服务器 http://localhost/jasper/...,您收到了 404(未找到)错误。

    【讨论】:

    • 试过你的建议,它似乎朝着正确的方向发展。它现在抛出以下错误:从源“localhost”访问 XMLHttpRequest 在“api.shiftbase.com/api/…”已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:预检请求不允许重定向.所以我似乎遇到了我之前描述的 CORS 问题。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 2015-01-28
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2014-03-29
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多