我正在开发一个Laravel 5-BackboneJs应用程序。我使用RESTful Resource控制器制作自己的API。
我有一个Backbone模型,然后我调用了save model方法。它产生了一个像这样的ajax请求:
gerencia.app/es/customrole/1
这就是为什么我尝试更新ID为1的模型。
Backbone使用PUT方法创建请求:
但是它给了我500个内部服务器错误!我看到预览了:
这是来自Laravel的TokenMismatchException,然后我发现我必须发送一个令牌,所以我在我的刀片视图中这样做了:
<meta name="token" content="{{ Session::token() }}">
然后我创建了一个设置令牌的函数,并将此函数添加到ajax beforeSend方法中:
function sendAuth( request ){
console.log( request );
return request.setRequestHeader("X-CSRF-Token", $("meta[name='token']").attr('content'));
}
model.save({
beforeSend: sendAuth,
success: function(){
console.log( 'success!' );
},
error: function(){
console.log( 'error!' );
}
});
但是,尽管我在请求标题中看到了令牌,但它仍无法正常工作:(
任何帮助?
答案 0 :(得分:2)
我可以按照Laravel网站上的说明进行操作。我将其添加到我的全局布局文件中:
<meta name="csrf-token" content="{{ csrf_token() }}" />
然后,我创建了一个名为csrf-token.js
的JS文件,并将此代码放入其中:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
执行此操作后,Backbone的POST请求正常工作,我可以在请求中看到额外的标头。对我而言,关键是在Backbone之后加入csrf-token.js
文件:
<script src="{{ asset('js/lib/backbone-min.js') }}"></script>
<script src="{{ asset('js/csrf-token.js') }}"></script>
我猜Backbone在加载时会覆盖ajax设置选项,因此您需要在此之后包含更改。
答案 1 :(得分:1)
我的解决方案是在我的模型方法中添加一个名为token的新键/值:
model.save({
"_token" : $("meta[name='token']").attr('content'),
success: function(){
console.log( 'success!' );
},
error: function(){
console.log( 'error!' );
}
});
您可以针对此问题发布另一种解决方案。