Http status:0 问题排查

Http status:0 也是一种日常ajax请求常见的错误,一般常见的200、500、404等都比较好理解,但是0这个在标准的http返回码中是不存在的

它其实是"XMLHttpRequest"的readyState的取值,只有readyState大于等于3时,才能拿到真正的http status,否则取http status应该抛出异常的,但是有些框架比如jquery对ajax请求进行了封装,会直接给status赋值。

状态 名称 描述
0 Uninitialized 初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。
1 Open open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。
2 Sent Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。
3 Receiving 所有响应头部都已经接收到。响应体开始接收但未完成。
4 Loaded HTTP 响应已经完全接收。

HTTP响应代码0表示AJAX请求已取消,可能会是以下几种情况:

  1. url路径或协议头错误
  2. 网络断开
  3. 防火墙拦截了请求
  4. 跨域请求
  5. 服务端响应前取消请求

通常需要注意的是2、3、4。出现这种情况时,应该重复请求,用浏览器直接访问请求以确认网络是否畅通,请求是否被防火墙拦截。

XMLHttpRequest status = 0 问题

最后翻啊翻啊,找啊找啊,终于找到一个XMLHttpRequest的说明

The status attribute must return the result of running these steps:

status的值一定会返回运行这些步骤的结果。

1、If the state is UNSENT or OPENED, return 0.(如果状态是UNSENT或者OPENED,返回0)
2、If the error flag is set, return 0.(如果错误标签被设置,返回0)
3、Return the HTTP status code.(返回HTTP状态码)

如果在HTTP返回之前就出现上面两种情况,就出现0了。

0 代表本地响应成功。

这里面还有一个问题,就是xmlhttp.readyState一直会变,

1: 服务器连接已建立

2: 请求已接收

3: 请求处理中

4: 请求已完成,且响应已就绪。

以这种情况看的话,应该是xmlhttp自己在模拟,因为根本就没通过服务器。本地直接打开而已。OPENED了,所以status为0。

第二个button的url访问虽然是其他域名,抓包是有的,但是,这是跨域访问了,

If the cross-origin request status is network error

This is a network error.

虽然去访问了,应该是浏览器跨域的返回头没有允许,所以浏览器阻止,Access-Control-Allow-Origin这个属性。

posted @ 2022-07-11 17:30  王猪猴  阅读(11852)  评论(0编辑  收藏  举报