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

Laravel能否仅返回数据而非视图?Inertia请求报错求解

解决Inertia请求下Laravel控制器返回JSON报错的问题

问题背景

通过Laravel控制器给页面弹窗sheet传递数据,使用web路由的GET请求,前端用Inertia的router.get发起请求。尝试返回JSON时收到错误:

All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.

不想创建独立API或使用Inertia共享数据,仅通过Inertia内部方案解决。

解决方案

1. 修改Laravel控制器,返回标准Inertia响应

控制器不能直接返回纯JSON,必须返回Inertia认可的响应格式。我们可以返回一个空组件作为数据载体:

<?php

namespace App\Http\Controllers;

use App\Data\OperatorMarkerData;
use App\Models\Marker;
use Inertia\Inertia;

class MarkerController extends Controller
{
    public function show(Marker $marker)
    {
        return Inertia::render('Empty', [
            'marker' => OperatorMarkerData::from($marker),
        ]);
    }
}

创建对应的空组件resources/js/Pages/Empty.jsx(仅用于传递数据,无需渲染任何内容):

export default function Empty() {
  return null;
}

2. 前端调整请求逻辑,提取响应数据

router.get返回Promise,需通过await获取响应,从response.props中提取所需数据。同时添加preserveState和preserveScroll参数,避免弹窗请求影响当前页面的状态和滚动位置:

const fetchMarker = async () => {
  if (markerId) {
    try {
      const response = await router.get(
        route('markers.show', markerId),
        {},
        { preserveState: true, preserveScroll: true }
      );
      setMarker(response.props.marker);
    } catch (error) {
      console.log(error);
    }
  }
};

原理说明

Inertia发起的请求会携带X-Inertia请求头,Laravel的Inertia中间件会验证响应是否为合法的Inertia响应(需包含X-Inertia响应头及对应格式数据)。纯JSON响应不符合校验规则,因此触发错误。通过返回带数据的Inertia组件响应,既满足了Inertia的校验要求,又能将数据传递给前端弹窗使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:16:02