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

Laravel中Ajax向控制器传值失败问题排查

问题描述

我有一个携带数据的按钮,代码如下:

<button type="button" class="btn btn-primary refund-initiate-btn"
        data-prn="{{ $item->PRN }}"
        data-rpptxnid="{{ $item->RPPTxnId }}"
        data-amount="{{ $item->AMOUNT }}"
        style="width: max-content;">Refund Initiate</button>

我想把这些数据传到Laravel控制器,写了AJAX代码来发送数据:

AJAX代码

<script>
    $(document).ready(function() {
        // 处理"Refund Initiate"按钮点击事件
        $(".refund-initiate-btn").on("click", function() {
            var prn = $(this).data("prn");
            var rpptxnid = $(this).data("rpptxnid");
            var amount = $(this).data("amount");

            // 构造要发送的数据对象
            var requestData = {
                prn: prn,
                rpptxnid: rpptxnid,
                amount: amount,
            };
            console.log(requestData);
            // AJAX请求
            $.ajax({
                url: "{{ route('refundlog') }}",
                type: "POST",
                data: JSON.stringify(requestData), // 转成JSON格式
                contentType: "application/json", // 设置Content-Type为JSON
                dataType: "json",
                beforeSend: function(xhr) {
                    xhr.setRequestHeader('X-CSRF-TOKEN', "{{ csrf_token() }}"); // 设置CSRF Token
                },
                success: function(response) {
                    // 处理响应
                    console.log(response);
                    // 可在此处理或展示响应内容
                },
                error: function(xhr, status, error) {
                    console.error(error);
                    // 处理错误
                }
            });
        });
    });
</script>

控制器代码

$prn = $request->input('prn');
$rpptxnid = $request->input('rpptxnid');
$amount = $request->input('amount');

目前AJAX里能正常打印出数据,但控制器拿不到这些值,问题出在哪?


问题原因及解决方案

核心问题是:你发送的是JSON格式的请求体,但Laravel默认的$request->input()方法是从表单编码数据(application/x-www-form-urlencoded)中取值的,无法直接解析JSON请求体。

两种解决方案任选其一即可:

方案一:修改AJAX发送表单格式数据(更简单)

不需要将数据转成JSON,直接传递对象即可,jQuery会自动处理为表单编码格式,Laravel能直接解析:

$.ajax({
    url: "{{ route('refundlog') }}",
    type: "POST",
    data: requestData, // 直接传原始对象,删掉JSON.stringify
    // 移除contentType配置,jQuery默认会设置为application/x-www-form-urlencoded
    dataType: "json",
    beforeSend: function(xhr) {
        xhr.setRequestHeader('X-CSRF-TOKEN', "{{ csrf_token() }}");
    },
    // 成功/错误回调保持不变
});

控制器代码无需修改,$request->input('prn')就能正常拿到值。

方案二:保持JSON请求,修改控制器解析逻辑

如果必须发送JSON格式请求,控制器需要从原始请求体中解析JSON:

// 方式1:解码原始JSON内容
$data = json_decode($request->getContent(), true);
$prn = $data['prn'];
$rpptxnid = $data['rpptxnid'];
$amount = $data['amount'];

// 方式2:用Laravel自带的json方法直接取值
$prn = $request->json('prn');
$rpptxnid = $request->json('rpptxnid');
$amount = $request->json('amount');

额外注意事项

  • 确认路由refundlog是POST类型,且定义在web.php中(如果是API路由需注意CSRF规则,不过你已手动添加CSRF头,无需额外调整)。
  • 检查请求头的Content-Type是否匹配:方案一对应application/x-www-form-urlencoded,方案二对应application/json。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:54