【问题标题】:MethodNotAllowedHttpException in laravel-5.6 with Ajax带有 Ajax 的 laravel-5.6 中的 MethodNotAllowedHttpException
【发布时间】:2018-11-30 09:34:30
【问题描述】:

我有一条路线

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 令牌。也尝试“方法”而不是“类型”
  • 运行php artisan routes 以确保路由已正确注册。还要检查生成的 URL 是否实际上是正确的,并且其中没有任何奇怪的转义
  • 让我为你写一个答案。
  • 您可以在浏览器控制台的网络选项卡中查看请求详细信息吗?
  • 使用像 create 这样的粗鲁操作而不是 save 然后 Route::post('/subscription/, Scuscription@create) 更好地使用资源:Route::resource('/subscriptions', 'SubscriptionsController');如果您有时间观看这两个视频以更好地设计您的 API youtube.com/watch?v=MF0jFKvS4SI vimeo.com/17785736

标签: laravel laravel-5


【解决方案1】:

405 ERROR - Method Not Allowed

如果它的 POST 方法 Laravel 需要 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);
    }
});

【讨论】:

    【解决方案2】:

    请将/subscription/save添加到VerifyCsrfToken Middleware中的$except数组中,则不需要定义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"
    
        ];
    }
    

    【讨论】:

      【解决方案3】:

      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 令牌。

      希望这会有所帮助。

      【讨论】:

      • Thankyou Adnan 我正在使用 CSRF 令牌其次路由工作,虽然我将其更改为绝对路径,但我仍然得到相同的错误
      • @MalikMudassar 是否有您正在使用的路由组或前缀?
      • 单路由,无组或前缀。
      • @MalikMudassar 您是否使用 apache 或 php artisan serve 提供文件?
      • apache 服务器,php 7.2 laravel 5.6
      【解决方案4】:

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

      <?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>
      

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

      【讨论】:

        【解决方案5】:

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

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

        你也可以这样做

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

        【讨论】:

          【解决方案6】:

          在你的标题中添加这个

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

          在你的 ajax 请求中添加这个

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

          【讨论】:

            猜你喜欢
            • 2018-09-17
            • 2019-03-25
            • 2018-11-01
            • 2019-01-06
            • 2018-04-03
            • 1970-01-01
            • 2019-01-17
            • 2018-08-12
            • 1970-01-01
            相关资源
            最近更新 更多