You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中XMLHttpRequest请求成功却无法读取响应的问题求助

问题:XMLHttpRequest调用.NET API无法读取响应内容

我知晓当前凭证传输方式不安全,后续会处理该问题。

我的问题是:使用XMLHttpRequest调用.NET API时,控制台显示请求成功(状态码200,响应内容为"web.html"),但无法在代码中读取response或responseText,打印结果为空。

我的实现代码如下:

const request = new XMLHttpRequest();
request.open('POST', 'https://someurl.net/api/user/login');
const form = document.getElementById('login')
form.addEventListener('submit', callbackFunction);

function callbackFunction(event) {
    event.preventDefault();

    request.setRequestHeader('Content-Type', 'application/json;charset=UTF-8')
    request.send(JSON.stringify(formJson(event)));
    console.log(request)

    console.log("Status: " + request.status);
    console.log("Response: " + request.response);
    console.log("ResponseText: " + request.responseText);
};

function formJson(event) {
    const credentialsDto = {};
    const myFormData = new FormData(event.target);
    console.log(myFormData);
    myFormData.forEach((value, key) => (credentialsDto[key] = value));

    return credentialsDto;
}

补充信息:后端.NET API在凭证错误时返回401 Unauthorized,凭证正确时返回200 OK及字符串"web.html"。

我尝试打印request对象的各类属性,还试过以下循环判断的方式,均无法获取响应内容:

while (true)
{
    if (request.readyState == 1)
    {
        console.log("Status: " + request.status);
        console.log("Response: " + request.response);
        console.log("ResponseText: " + request.responseText);
        break;
    }
}

解决方案

核心问题是XMLHttpRequest是异步操作,你在调用send()后立刻打印响应,此时请求还在后台处理,根本没完成,自然拿不到数据。那个while循环也完全错误,readyState=1是请求已打开但还没发送的状态,和请求完成毫无关系。

正确做法是监听请求的load事件(或readystatechange事件),等请求完成且状态正常时再读取响应。同时把request对象的创建放到submit回调里,避免多次提交复用同一个请求对象引发问题。

修改后的代码:

const form = document.getElementById('login')
form.addEventListener('submit', callbackFunction);

function callbackFunction(event) {
    event.preventDefault();
    // 每次提交新建一个请求对象
    const request = new XMLHttpRequest();
    request.open('POST', 'https://someurl.net/api/user/login');
    request.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
    
    // 监听请求完成事件
    request.addEventListener('load', function() {
        if (this.status === 200) {
            console.log("Status: " + this.status);
            console.log("Response: " + this.response);
            console.log("ResponseText: " + this.responseText);
        } else if (this.status === 401) {
            console.log("凭证错误,请检查账号密码");
        }
    });
    
    request.send(JSON.stringify(formJson(event)));
};

function formJson(event) {
    const credentialsDto = {};
    const myFormData = new FormData(event.target);
    myFormData.forEach((value, key) => (credentialsDto[key] = value));
    return credentialsDto;
}

内容的提问来源于stack exchange,提问作者Rogelio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:35:15