方法不允许Http异常Ajax请求

时间:2019-06-20 12:34:07

标签: php ajax laravel

我正在尝试通过laravel 5中的ajax更新一些数据,但是我正面临MethodNotAllowed Http异常。

因此,我在web.php中创建了资源路由,这是一个HTML表单,用于在文本框中预先填充一些数据以及一些Ajax代码。

用于Web.php的代码,通过管理员为前缀。

Route::resource('settings', 'OrganisationSettingsController', ['only' => ['edit', 'update', 'index', 'change-language']]);

HTML表单代码

{!! Form::open(['id'=>'editSettings','class'=>'ajax-form','method'=>'PUT']) !!} //Input Elements Goes Here... {!! Form::close() !!} Ajax呼叫代码

$('#save-form').click(function () {
    $.easyAjax({
        url: '{{ route('admin.settings.update', ['1']) }}',
        container: '#editSettings',
        type: "POST",
        redirect: true,
        file: (document.getElementById("logo").files.length != 0 || document.getElementById("login_background").files.length != 0) ? true : false
    })
});

当用户单击更新按钮时,必须更新数据,但在浏览器控制台中却出现http方法不允许异常的情况。

4 个答案:

答案 0 :(得分:1)

您正在发布数据。 当您在路由器中发布数据并使用资源时,laravel会调用存储功能,并且您的路由不会让它(['only' => ['edit', 'update', 'index', 'change-language']).

要进行测试,它会将存储功能添加到您的路线中,dd($request);您可以看到request;

答案 1 :(得分:0)

请勿使用方法=> PUT形式。而是改为

{!! Form::open(['id'=>'editSettings','class'=>'ajax-form','method'=>'POST']) !!}
@method('PUT')
@csrf

//input elements here

{!! Form::close() !!}

您需要更改'method'=>'POST',并添加 @method('PUT') @csrf 以上

答案 2 :(得分:0)

假设easyAjax允许应包含以下内容的数据属性,您将需要从ajax调用中欺骗您的方法:

data: {
    '_method' : 'PUT'
},

此外,您将希望包含csrf令牌:

data: {
    '_method' : 'PUT',
    '_token' : '{{csrf_token()}}'
},

注意:只要脚本是刀片视图的一部分,'{{csrf_token()}}'就会起作用。如果不是,则使用标题:

headers: {
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}

如果您需要使用标头来包含csrf令牌,请确保在文档的头部包含meta标签:

<meta name="csrf-token" content="{{ csrf_token() }}">

完整解决方案:

$('#save-form').click(function () {
    $.easyAjax({
        url: '{{ route('admin.settings.update', ['1']) }}',
        container: '#editSettings',
        type: "POST",
        data: {
          '_method' : 'PUT',
          '_token' : '{{csrf_token()}}'
        },
        redirect: true,
        file: (document.getElementById("logo").files.length != 0 || 
        document.getElementById("login_background").files.length != 0) ? true : false
    })
});

详细了解method spoofing

答案 3 :(得分:0)

感谢@adam的回答,这正是问题所在。最后,我编写了以下代码以获得预期结果

Field