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

如何不使用jQuery让Laravel识别AJAX请求并返回JSON响应

用原生JavaScript实现Laravel验证失败时返回JSON响应

嘿,这个问题的关键在于Laravel判断是否返回JSON响应的依据——它不仅看你发送的Content-Type,更重要的是要看请求头里的Accept字段。当你用jQuery的$.ajax({dataType: 'json'})时,jQuery会自动帮你加上Accept: application/json请求头,Laravel识别到这个头后,就算验证失败也会返回JSON格式的错误信息;而你之前只设置了Content-Type,没告诉服务器你期望接收JSON响应,所以Laravel可能还是返回了默认的HTML或重定向。

下面是完整的原生JavaScript实现代码,我帮你补上了关键的Accept请求头,同时也处理了POST请求时的JSON数据序列化:

var xhr = new XMLHttpRequest();
var url = '/your-api-endpoint'; // 替换成你的Laravel路由地址
var data = {
    // 这里是你要发送的表单数据
    name: 'Test',
    email: 'test@example.com'
};

// 设置请求方法和URL
xhr.open('POST', url, true);

// 关键:添加Accept请求头,告诉服务器你期望接收JSON
xhr.setRequestHeader('Accept', 'application/json');
// 设置Content-Type,告诉服务器你发送的是JSON格式数据
xhr.setRequestHeader('Content-Type', 'application/json');

// 监听响应状态变化
xhr.onreadystatechange = function() {
    if (xhr.readyState === XMLHttpRequest.DONE) {
        if (xhr.status >= 200 && xhr.status < 300) {
            // 请求成功,解析JSON响应
            var response = JSON.parse(xhr.responseText);
            console.log('Success:', response);
        } else {
            // 验证失败或其他错误,解析JSON错误信息
            try {
                var errors = JSON.parse(xhr.responseText);
                console.log('Validation Errors:', errors);
            } catch (e) {
                // 万一没返回JSON,处理异常情况
                console.log('Error:', xhr.responseText);
            }
        }
    }
};

// 序列化JSON数据并发送
xhr.send(JSON.stringify(data));

为什么这样做?

  • Content-Type: application/json:告诉Laravel服务器,你发送的请求体是JSON格式的,这样Laravel才能正确解析请求数据(需要确保你的路由使用了web或api中间件,并且开启了JSON解析)。
  • Accept: application/json:这是核心!Laravel的异常处理器(比如ValidationException)会检查这个请求头,如果存在且值为application/json,就会自动返回JSON格式的错误响应,而不是默认的重定向或错误视图。

如果你是发送GET请求,不需要发送请求体,那只需要设置Accept请求头即可,不需要Content-Type和send(JSON.stringify(data))这部分。

内容的提问来源于stack exchange,提问作者Mr.Bakaop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:56:16