【问题标题】:Laravel Ajax Update Method Not Allow 405Laravel Ajax 更新方法不允许 405
【发布时间】:2019-05-10 13:39:31
【问题描述】:

我一直卡在我正在做的这行代码上。它说不允许 mthod 但是我已经做了一些修复来接受请求

服务控制器

public function peakmode(Request $request, $id)
{
    $command = new \App\BizCommands\UpdatePeakmodeServices();
    $arr = $request->all();
    //$arr["merchant_id"] = $this->get_id();
    $service->merchant_id = 1;
    $arr["id"] = $id;
    $ret = $command->execute($arr, Auth::user());
    //return response()->json(['success'=> ($ret->error_code==0), 'message'=> $ret->message]);

    $message = array('message' => 'Service Successfully Updated!');
    return redirect()->back()->with($message);
}

刀片形态

<form action="{{ route('services.peakmode', $service->id) }} ">
{{method_field('PUT')}}
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="serviceswitch-7838" service-id="{{ $service->id }}"> 
<label class="onoffswitch-label" for="serviceswitch-7838"> <span class="onoffswitch-inner"></span> <span class="onoffswitch-switch"></span> </label>

Ajax 脚本

$(".onoffswitch .onoffswitch-checkbox").on("change",function(e){
  service_id = $(this).attr('service-id');
  if($(this).is(':checked') ){
    peak = 1;
  }else{
    peak = 0;
  }
  $.ajax({
    method: "POST",
    url: $(this).prop('action'),
    data: { 
      service_id: service_id,
      peak: peak,
      '_method': 'PUT',
      "_token": "{{ csrf_token() }}",
    }
  })
  .done(function(response){
    console.log(response);
  });
});

路线

Route::post('/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');

【问题讨论】:

    标签: jquery ajax laravel post


    【解决方案1】:

    您已经添加了方法POST的路由,并在表单中使用了方法PUT,在表单中将方法PUT更改为POST

     {{method_field('POST')}}
    

    【讨论】:

      【解决方案2】:

      更改路线到:

      Route::match(['POST', 'PUT'], '/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');
      

      【讨论】:

        【解决方案3】:

        您必须在 ajax 中仅添加方法 POST,然后您必须像这样添加 X-CSRF-TOKEN

        Laravel 文档 https://laravel.com/docs/5.7/csrf#csrf-x-xsrf-token

        除了检查 CSRF 令牌作为 POST 参数外,VerifyCsrfToken 中间件还将检查 X-CSRF-TOKEN 请求标头。例如,您可以将令牌存储在 HTML 元标记中:

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

        然后,一旦您创建了元标记,您就可以指示 jQuery 之类的库自动将标记添加到所有请求标头中。这为基于 AJAX 的应用程序提供了简单、方便的 CSRF 保护:

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

        现在,您的 ajax 请求应该如下所示,

        $.ajax({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            },
            type:'POST',
            url: $(this).prop('action'),
            data: { 
              service_id: service_id,
              peak: peak,
            }
            success: function(result) {
                console.log(result);
            },
            error: function(result){
                console.log(result);
            }
        });
        

        如果有任何困惑,请随时询问。

        这里是如何使用 laravel 和 ajx 发出补丁请求,请参阅这个问题 PATCH AJAX Request in Laravel

        【讨论】:

        • 正如我们在这里看到的getTokenFromRequest Laravel 可以同时读取_tokenX-CSRF-TOKEN,因此没有义务只使用X-CSRF-TOKEN
        • 500 错误通常是 PHP 错误,请检查控制器中的逻辑。你也可以使用控制台
        • @d'reaper 检查你的控制器代码应该有问题。
        【解决方案4】:

        你使用的是 POST 而不是 PUT

        Route::put('/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');
        

        我不确定 PUT 是否也用于 AJAX,但如果单独失败,你可以尝试一下。

        我自己不专业地使用所有 POST 和 GET,所以我不必处理 PUT 和 DELETE

        我的解决方法:

        <form action="{{ route('services.peakmode', $service->id) }} " method="POST">
        //make sure not to include the {{method line}}
        

        AJAX 调用

        $.ajax({
            method: "POST",
            url: $(this).prop('action'),
            data: { 
              service_id: service_id,
              peak: peak,
              "_token": "{{ csrf_token() }}",
            }
          })
        

        路线

        Route::post('/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');
        

        【讨论】:

        • 好吧,我已经将其更改为放置。但仍然在 console.log /merchant/services 405 (Method Not Allowed) 上得到这个错误结果
        • 所以我建议你单独使用 POST,通常会一直为我完成这项工作
        • 500 错误通常是 PHP 错误,请检查控制器中的逻辑。你也可以使用控制台
        猜你喜欢
        • 2017-05-31
        • 2017-06-08
        • 2019-07-29
        • 2018-01-25
        • 1970-01-01
        • 2020-07-25
        • 2017-11-28
        • 1970-01-01
        • 2019-03-25
        相关资源
        最近更新 更多