使用Ajax的laravel-5.6中的MethodNotAllowedHttpException

使用Ajax的laravel-5.6中的MethodNotAllowedHttpException,laravel,laravel-5,Laravel,Laravel 5,我有一条路线 Route::post('/subscription/save','SubscriptionController@save')->name('sub.save'); 这是唯一一条没有重复的路线,我用Ajax提交了这段代码 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $('.

我有一条路线

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

似乎您还没有从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',
    ];
}
在脚本中

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

$.ajaxSetup({
标题:{
'X-CSRF-TOKEN':$('meta[name=“CSRF-TOKEN”]).attr('content'))
}
});

我希望这有助于您解决问题。

将其添加到标题中

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

这看起来像是CSRF令牌的问题,因为您没有向后端发送任何令牌。您可以使用元标记

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

你也能做到

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

$.ajaxSetup({
标题:{
'X-CSRF-TOKEN':$('meta[name=“CSRF-TOKEN”]).attr('content'))
}
});

如果其后处理方法Laravel需要

您只需在AJAX中添加
\u令牌

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);
    }
});

Mudassir如果您遇到此错误,或者您试图在
.js
文件中使用刀片语法
{{}

使用绝对路径或在
刀片文件中使用此语法

$('.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令牌


希望这有帮助。

请在验证CSRFToken中间件中添加/subscription/save$除了数组,然后它就不需要定义csrf token

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"

    ];
}

检查csrf令牌。还可以尝试使用“方法”而不是“类型”运行
php artisan routes
,以确保正确注册路由。另外,请检查生成的URL是否确实正确,并且没有任何奇怪的转义。让我为您写一个答案。您可以在浏览器控制台的“网络”选项卡中检查请求详细信息吗?使用crud操作,如
创建
,而不是
保存
,然后
路由::发布('/subscription/,
Scubscription@create
更好地使用资源:
路由::资源(“/subscriptions”,“subscriptioncontroller”)
;如果您有时间观看这两个视频以更好地设计您的API,谢谢Adnan,我正在使用CSRF Token Secondary route works,尽管我将其更改为绝对路径,但我还是得到了相同的结果error@MalikMudassar是否有您正在使用的路由组或前缀?单路由,没有组或前缀。@MalikMudassar正在使用apache或<代码>php artisan serve
?apache服务器,PHP7.2 laravel 5.6
$('.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');
    });  
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"

    ];
}