【发布时间】:2016-07-24 19:19:52
【问题描述】:
我的 Chrome 扩展程序中有一个内容脚本,它在某些 HTTPS 页面上运行。它正在尝试向 HTTP 页面(通过后台脚本)发送 POST 请求,该页面是我设置的 API 的路由。我正在尝试发送 JSON 数据。但是,即使就绪状态为 4,我的状态仍为 0。我使用 Postman 执行相同的帖子并且它有效。这使我相信这是一个 HTTPS 协议问题,但是我在同一后台脚本中的 HTTP 页面上执行 GET 并且工作正常。那可能是什么问题?这是我的 POST 代码:
var string = json;
xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
var json = JSON.parse(xhr.responseText);
}
};
xhr.send(string);
谢谢!
更新:
我使用 chrome 开发者工具调试后台脚本,发现错误是“对预检请求的响应未通过访问控制检查:没有 'Access-Control-Allow-Origin' 标头出现在请求的资源。”。我猜后台脚本错误不会打印到主控制台。
更新:
我必须将发布到的网站添加到清单中的权限字段。现在可以了。
【问题讨论】:
-
没有像0这样的状态码,请参考developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes
-
不管怎样,当我进入onreadystatechange函数查看xhr.status时,都是0。
-
状态 0 通常意味着请求被中止,要么是intentionally,要么是由于中断(例如导航导致页面被卸载)。请求已经“完成”了(所以,
readyState === 4),但没有收到任何响应来设置不同的状态。 -
@gtsioni 更新了我的答案。如果你想讨论调试 AJAX 错误的其他方法,我们可以找个时间聊聊。
-
我在响应 OPTIONS 调用时也看到了这一点,ajax 层报告状态 0,但 Fiddler 显示 500(原始响应显示 500),并带有描述错误的有效 html 正文。跨度>
标签: javascript post google-chrome-extension xmlhttprequest