【问题标题】:Why is this HTTP request failing? [duplicate]为什么这个 HTTP 请求失败? [复制]
【发布时间】:2018-03-02 01:28:04
【问题描述】:

我正在使用此代码发出 API 请求:

function httpGet(url){
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
    console.log(this.status)
    if (this.readyState == 4 && this.status == 200) {
        console.log("Got names")
       getNamesFromJSONArray(request.responseText);
    };
};
request.open("GET", url, true);
request.setRequestHeader("Authorization", "Basic (API key goes here)");
request.setRequestHeader("Accept-Encoding", "gzip");
request.send();
}

前几天还有效,但现在失败了,告诉我:

加载资源失败:预检响应不成功

XMLHttpRequest 无法加载 https://api.insight.ly/v2.1/contacts。 预检响应不成功

此外,永远不会打印“Got names”。

为什么这段代码在前几天工作时会中断?是 API 端的问题还是我的问题?

更新! 我在 api 网站上找到了this。实现这一点的最简单方法是什么?我目前没有后端,除此之外不需要任何后端。我理解这个问题是因为他们不希望我的 API 在客户端可读的 Javascript 中,这是有道理的。我可以通过其他方式登录 API,比如通过用户的电子邮件和密码吗?

【问题讨论】:

  • 对我来说听起来像是 CORS 问题。您可能需要发送正确的访问标头。
  • @ObsidianAge 那为什么前几天还有效呢?
  • 有关这里发生的事情的解释,请参阅 stackoverflow.com/a/45533146/441757stackoverflow.com/questions/45586064/…stackoverflow.com/questions/45210184/… (不幸的是,标记为重复的问题没有真正解释所有行为的答案这种情况,据我所知)。要点是:https://api.insight.ly/v2.1/contacts 端点需要对 OPTIONS 请求进行授权。它不应该。
  • 因为https://api.insight.ly/v2.1/contacts 需要对 OPTIONS 请求进行授权,所以您无法修复它——您将无法从浏览器中运行的前端 JavaScript 代码向该端点发出请求,并且从中取回数据。如果它对您之前的工作没有任何错误,那么我想您只能假设 https://api.insight.ly/v2.1/contacts 所有者最近改变了行为(我猜想需要对 OPTIONS 请求进行授权),这就是您的问题
  • @sideshowbarker 感谢您的回复。所以基本上没有后端就没有办法访问这些数据?

标签: javascript http xmlhttprequest


【解决方案1】:

API 需要能够(正确)处理 CORS,具体来说,您的问题是关于 preflight

在进行实际的 CORS 调用之前,它会使用 OPTIONS 方法尝试相同的调用,以确保调用是安全的。服务器应为此返回某些标头。

是的,这是在 API 方面。

您可以阅读有关HTTP access control (CORS)的更多详细信息

【讨论】:

  • 感谢您的回答!我对此进行了调查并发布了我的问题的更新。有什么建议吗?
  • 在我看来,他们已经回答了你的问题。不,你不能使用CORS(你不能直接调用API),他们已经给你一个选项,那就是写一个代理。
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2014-08-22
  • 2021-11-18
  • 2016-08-27
  • 2015-02-08
相关资源
最近更新 更多