以 HTTP 错误消息为目标

Posted

技术标签:

【中文标题】以 HTTP 错误消息为目标【英文标题】:Targetting HTTP Error Messages 【发布时间】:2017-05-24 11:36:28 【问题描述】:

我正在尝试使用 AJAX 将 JSON 编码的数据字符串发送到远程机器。 每当我尝试将数据字符串发送到远程机器时,都会出现以下两条错误消息之一:

XMLHttpRequest cannot load http://10.1.0.139:8000/. 
No 'Access-Control-Allow-Origin' header is present on 
the requested resource. Origin 'http://localhost' is 
therefore not allowed access.

当远程机器开机并接受连接时会出现此消息。然而,虽然我收到了这个错误,但我的代码完全按照我的意愿工作 - 就像远程机器接收到正确的数据一样。

POST http://10.1.0.139:8000/ net::ERR_CONNECTION_REFUSED

当远程机器关机或没有运行自己的服务器来接受传入的请求和连接时,就会出现此消息。

问题是,我希望能够区分这两个错误消息,但我不知道如何区分。我不能使用 AJAX 回调,例如 error() 或 fail(),因为总会出现错误 - 尽管 HTTP 状态为 200 表明一切正常(当显示第一条错误消息)。

有没有一种方法可以让我执行类似于“如果我无法连接到远程机器,请执行...”的伪命令

编辑

我刚才注意到的一点是,我的远程计算机不显示来自 Internet Explorer 的传入连接 - 而是显示如下:

XMLHttpRequest: Network Error 0x2efd,   
Could not complete the operation due to error 00002efd.

【问题讨论】:

在 :8000 向服务器添加 CORS 响应 ...然后您将能够读取服务器在 :8000 发送的任何响应 或者,XMLHttpRequest 确实有一个timeout 设置和一个timeout 事件... 【参考方案1】:

使用 XMLHttpRequest 超时

var xhr = new window.XMLHttpRequest();
var data = 'x=1';
xhr.open('POST', 'http://10.1.0.139:8000/');
xhr.timeout = 5000;
xhr.addEventListener('timeout', function(e) 
   // handle dead server 
   console.log('timeout');
   console.error(e);
);
xhr.addEventListener('error', function(e) 
   // handle error - CORS probably in this case
   console.log('error');
   console.error(e);
);
xhr.addEventListener('load', function(e) 
   // handle success
   console.log('load');
   console.info(e);
);
xhr.send(data);

这会在 CORS 错误的情况下触发error,在没有服务器的情况下触发timeout

【讨论】:

我不认为超时方法会起作用,因为通常在几秒钟内它会报告说“net::ERR_CONNECTION_REFUSED” 真的吗?哪个浏览器(以及它的哪个版本)可以做到这一点? Google Chrome 版本 54.0.2840.99 是的,唯一被触发的是error 奇怪 - 我似乎记得这与广告拦截器或类似的东西有关?在 SO 上阅读它,所以它必须是真的:p

以上是关于以 HTTP 错误消息为目标的主要内容,如果未能解决你的问题,请参考以下文章

不会加载以子域为目标的iframe。

Resource Exceeded 错误消息按顺序排列

编译器错误消息:编译器失败,错误代码为 -532462766

HTTP-相应状态

GCP Cloud Scheduler 为 HTTP 目标类型抛出错误

pytorch:“不支持多目标”错误消息