Laravel中Ajax请求数据在控制器为空问题求助
问题排查与解决方案
问题原因
你在AJAX请求中错误配置了processData: false和contentType: false,这两个参数仅适用于上传文件或使用FormData对象的场景。当传递普通键值对数据时,这两个设置会阻止jQuery自动将数据编码为标准的application/x-www-form-urlencoded格式,导致Laravel无法解析POST请求体,最终控制器中的Request对象为空。
解决方案
移除AJAX配置中的processData和contentType参数(jQuery默认会自动处理这两项),同时确保CSRF令牌正确包含在请求数据中(即使你排除了令牌问题,显式携带可避免潜在异常)。
修正后的AJAX代码
$(document).on('click', '#status_update', function(e) { if ($(this).prop('checked')) { $(this).addClass('bg-primary border-2'); } else { $(this).removeClass('bg-primary'); } var data = { _token: "{{ csrf_token() }}", // 显式携带CSRF令牌 id: $(this).data('id'), status: $(this).prop('checked') ? 1 : 0, }; var url = "{{ route('changeFirmwareStatus') }}"; $.ajax({ type: "POST", url: url, data: data, dataType: "json", success: function(response) { toastr.options = { "closeButton": true, "progressBar": true, "showDuration": 300, "timeOut": 2000, "hideDuration": 1000, // "preventDuplicates": true, } toastr[response.state](response.message); } }); });
控制器代码优化(可选)
添加请求验证确保数据合法性,同时简化逻辑:
public function changeFirmwareStatus(Request $request) { // 验证请求参数 $validated = $request->validate([ 'id' => 'required|integer|exists:firmwares,id', 'status' => 'required|boolean', ]); Firmware::findOrFail($validated['id'])->update(['status' => $validated['status']]); return $this->JsonResponse(200, 'success', 'Firmware Status Successfully Changed !'); }
内容的提问来源于stack exchange,提问作者Muhammad Kamran
相关产品推荐
相关产品推荐

