我有一条路线
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答案 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')
},