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

如何使用XMLHttpRequest发送JSON数据到Laravel并存入数据库

问题排查与修复步骤

1. 调试无输出问题

你发起的是异步XMLHttpRequest请求,页面没有刷新,dump/dd/var_dump的输出不会直接显示在当前浏览的页面上,按以下步骤查看调试输出:

  • 打开浏览器F12开发者工具,切换到「网络/Network」面板
  • 提交问卷触发请求后,找到请求路径为/api/survey的POST请求
  • 点击该请求,切换到「响应/Response」标签即可看到调试函数的输出内容

2. Auth::user()不生效、数据无法传到控制器的核心原因

你使用了web.php定义路由,默认携带VerifyCsrfToken中间件校验,你的AJAX请求未携带CSRF令牌,请求直接被中间件拦截,没有进入控制器执行逻辑,修复方式:

  • 先确认Blade模板的<head>标签内存在CSRF的meta声明:
<meta name="csrf-token" content="{{ csrf_token() }}">
  • 修改你的JS请求代码,补充CSRF请求头:
var survey = new Survey.Model(this.surveyJSON, surveyContainer);
survey.onComplete.add(function (sender, options) {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "/api/survey");
    xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    // 新增CSRF头
    xhr.setRequestHeader('X-CSRF-TOKEN', document.querySelector('meta[name="csrf-token"]').content);
    xhr.send(JSON.stringify(sender.data));
    console.log(JSON.stringify(sender.data));
});

如果后续你把路由迁移到api.php,需要额外给路由加web中间件,因为api.php默认无会话中间件,无法读取登录态。

3. 存储逻辑错误修复

你的控制器存储代码存在两处语法错误:

  • author_id为用户ID字段,不要传入整个用户对象,取主键ID即可
  • response()->json()是用于返回响应的方法,存储JSON直接用json_encode或者借助模型的$casts自动转换
    正确写法参考:
    首先在Survey模型中添加casts配置,方便后续读取自动转数组:
// app/Models/Survey.php
protected $casts = [
    'answers' => 'array',
];

控制器存储代码修改为:

public function retrieval(\Illuminate\Http\Request $request)
{
    // 可自行补充参数校验逻辑
    Survey::create([
        'answers' => $request->all(),
        'author_id' => Auth::id()
    ]);
    // 给前端返回响应确认提交成功
    return response()->json(['status' => 'success']);
}

内容的提问来源于stack exchange,提问作者Murphy's_Law_Personified

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:30:02