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
相关产品推荐
相关产品推荐

