Laravel Ajax更新方法不允许405
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel Ajax更新方法不允许405相关的知识,希望对你有一定的参考价值。
我一直坚持我正在做的这一行代码。它说该方法是不允许的,但我已经做了一些修复来接受请求
服务控制器
public function peakmode(Request $request, $id)
{
$command = new AppBizCommandsUpdatePeakmodeServices();
$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}', 'MerchantServicesController@peakmode')->name('services.peakmode');
您使用POST而不是PUT
Route::put('/merchant/services/peakmode/{id}', 'MerchantServicesController@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}', 'MerchantServicesController@peakmode')->name('services.peakmode');
你必须在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
改变路线:
Route::match(['POST', 'PUT'], '/merchant/services/peakmode/{id}', 'MerchantServicesController@peakmode')->name('services.peakmode');
你已经添加了方法POST
的路线和使用方法PUT
形式改变方法PUT
到形式POST
{{method_field('POST')}}
以上是关于Laravel Ajax更新方法不允许405的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.1 AJAX - 即使我发送 POST 请求,也不允许返回 405 GET 方法
在 Laravel 5.2 上路由文件路径时出现 405(不允许的方法)