带有Ajax的laravel-5.6中的MethodNotAllowedHttpException

时间:2018-06-21 06:42:55

标签: laravel laravel-5

我有一条路线

Route::post('/subscription/save','SubscriptionController@save')->name('sub.save');

这是唯一没有重复的路线,我是由Ajax通过这段代码提交的

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
$('.btn-ok').click(function(){            

        $.ajax({
            type: 'POST',
            data: {
                'card_type':$('#card_type').val(),
                'card_number':$('#card_number').val(),
                'expiry':$('#expiry').val(),
                'cvv':$('#cvv').val(),
                'name':$('#name').val(),
                'surname':$('#surname').val(),
                'address1':$('#address1').val(),
                'address2':$('#address2').val(),
                'province':$('#province').val(),
                'city':$('#city').val(),
                'country':$('#country').val(),                
                'box_id':$('#sub_box_id').val()
            } ,
            url: "{{route('sub.save')}}",
            success: function(data){
                console.log(data);
            }
        });
        $('#myModal').modal('hide');
    });   

如果我在控制台中记录数据变量,它看起来很好。这是我的控制器功能

    public function save(Request $request)
    {
     $Subscription=new Subscription;
     return $request;
    }

我尝试了退货请求,但又再次收到此405错误

 Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
 No message

我在做什么错了?

======================== 我已经更新了帖子,我在标题

中使用CSRF

6 个答案:

答案 0 :(得分:2)

405 ERROR - Method Not Allowed

如果Laravel的POST方法需要CSRF value to Prevent Cross-site request forgeries

您只需在AJAX中添加_token

var token = "{{ csrf_token() }}";

'_token':token,

最终密码

var token = "{{ csrf_token() }}";

$.ajax({
    type: 'POST',
    data: {
        '_token':token,
        'card_type':$('#card_type').val(),
        'card_number':$('#card_number').val(),
        'expiry':$('#expiry').val(),
        'cvv':$('#cvv').val(),
        'name':$('#name').val(),
        'surname':$('#surname').val(),
        'address1':$('#address1').val(),
        'address2':$('#address2').val(),
        'province':$('#province').val(),
        'city':$('#city').val(),
        'country':$('#country').val(),                
        'box_id':$('#sub_box_id').val()
    } ,
    url: "{{route('sub.save')}}",
    success: function(data){
        console.log(data);
    }
});

答案 1 :(得分:2)

请在 VerifyCsrfToken中间件中将 / subscription / save 添加到 $ except array 中,则不必定义 csrf令牌< / strong>

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [

          "/subscription/save"

    ];
}

答案 2 :(得分:1)

似乎您没有从CSRF中间件中排除此URL。您的应用程序希望它是带有CSRF令牌的普通POST方法,但是您正在发送一个AJAX请求,默认情况下它不知道CSRF令牌。快速解决方案是从VerifyCsrfToken中间件中排除该URL。你会做这样的事情;

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'subscription/save',
    ];
}

或者您可以将AJAX配置为随每个请求在标头X-CSRF-TOKEN中发送CSRF令牌。这是执行AJAX请求的更安全,更好的方法,并且它将处理所有AJAX请求,而不是将每个URL添加到VerifyCsrfToken中间件中。

标题中

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

脚本中

<script type="text/javascript">
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
</script>

我希望这可以帮助您解决问题。

答案 3 :(得分:1)

这似乎是CSRF令牌的问题,因为您没有将任何令牌发送到后端。您可以使用元标记

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

您也可以

<script type="text/javascript">
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
</script>

答案 4 :(得分:1)

Mudassir您正在尝试在{{}}文件中使用刀片语法.js时遇到此错误

要么使用绝对路径,要么在blade file中使用此语法。

$('.btn-ok').click(function(){            

        $.ajax({
            type: 'POST',
            data: {
                'card_type':$('#card_type').val(),
                'card_number':$('#card_number').val(),
                'expiry':$('#expiry').val(),
                'cvv':$('#cvv').val(),
                'name':$('#name').val(),
                'surname':$('#surname').val(),
                'address1':$('#address1').val(),
                'address2':$('#address2').val(),
                'province':$('#province').val(),
                'city':$('#city').val(),
                'country':$('#country').val(),                
                'box_id':$('#sub_box_id').val()
            } ,
            url: "/subscription/save",
            success: function(data){
                console.log(data);
            }
        });
        $('#myModal').modal('hide');
    });  

第二,您正在使用POST方法,请确保在请求中添加CSRF令牌。

希望这会有所帮助。

答案 5 :(得分:0)

将此添加到标题中

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

将此添加到您的ajax请求中

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