为什么200 HTTP响应代码上的XmlHttpRequest readyState=2

Why XmlHttpRequest readyState = 2 on 200 HTTP response code

本文关键字:XmlHttpRequest readyState HTTP 响应 代码 为什么      更新时间:2023-09-26

所以我使用纯javascript(无jquery)将文件发送到服务器。服务器脚本PHP在最后返回状态代码200,但javascript却变为readyState==2。

PHP代码发回状态代码200:

header('X-PHP-Response-Code: 200', true, 200);
exit;

javascript正在做:

request.onreadystatechange = function() {
        if (request.readyState == 4) {
            var message;
            switch(request.status) {
                case '200':
                     message = "Data uploaded successfully.";
                break;
                case '406':
                    message = "Incorrect file format.  Please try again.";
                break;
                case '410':
                    message = "Unexpected error.  Please contact support.";
                break;
                default:
                break;
            }
            status_message_container.innerHTML = message;
            submit_button.disabled = false;
        }
        else {
            alert( "Unexpected error:  " + this.statusText + ".'nPlease try again");
        }
    };
    request.send(formData);

甚至知道HTTP200状态代码在前端返回正确(我得到"OK")。JS脚本看到readyState==2(即else块总是命中)

我的理解是,200的服务器状态代码应该给出readyState == 4??

首先,onreadystate不只是发射一次。它被多次发射,你需要能够处理它。以下是您需要处理的代码:

0 UNSENT-尚未调用open()
1打开-尚未调用send()
2 HEADERS_RECEIVED-send()已被调用,标头和状态可用
3加载下载;-responseText保存部分数据
4-操作完成

您的代码正在readyState == 2上的else块(已接收到标头)中,并假设这是错误状态,而事实并非如此。

错误检查应在request.readyState == 4检查内。这样,请求就完成了,但也可能出现错误:

if (request.readyState == 4) {
    switch(request.status) {
        case '200':
            message = "Data uploaded successfully.";
        break;
        // Error handling here
        default: alert( "Unexpected error:  " + this.statusText + ".'nPlease try again"); break;
    }
}

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest