繁体   English   中英

在Laravel中使用Vue.js和Vue资源调用AJAX

[英]Call AJAX with Vue.js and Vue resource in Laravel

我正在使用Vue.js和Vue资源在Laravel中提出AJAX请求。

我有看法:

{{Form::open(['method' => 'post', 'class' => 'form-inline', 'id' => 'main-form'])}}
{{Form::text('param1', null, ['id' => 'param1', 'class' => 'form-control'])}}
{{Form::text('param2', null, ['id' => 'param2', 'class' => 'form-control'])}}
<input @click="sendIt($event)" type="submit" value="Check prices" class="btn btn-success btn-theme" />
{{Form::close()}}

我有js:

var Vue = require('vue');
var VueResource = require('vue-resource');
Vue.use(VueResource);
Vue.http.headers.common['X-CSRF-TOKEN'] = $('meta[name=_token]').attr('content');
const app = new Vue({
el: '#app',
methods: {
sendIt: function (e)
    {
        e.preventDefault();
        var token = $('[name="_token"]').val();
        this.$http.post('/data').then((response) => {
            console.log(response);
        }, (response) => {
            console.log(response);
        });
    }
}

路线:

Route::post('/data', 'MainController@data');

和控制器:

public function data() 
{
    $msg = $this->test(); //method that retrieves data from db
    return response()->json(['msg'=> $msg], 200);
}

它给我发布500内部服务器错误

作为回应,我有这个标题:

Cache-Control
Content-Type
Date
Phpdebugbar-Id
Server
Status
Transfer-Encoding
X-Powered-By

在数据站点的网络中,我有没有令牌的响应标头,有令牌的请求标头,在请求有效负载中有令牌。

如果我更改要获取的方法,则会遇到相同的错误,但是如果我更改要获取的方法,并且如果我从控制器的代码部分中删除了我从db检索数据并将字符串传递给json的示例(例如:

$msg = 'test';
return response()->json(['msg'=> $msg], 200);

我成功了,可以在页面上输出测试。

因此,我不确定令牌是否有问题或其他问题。 我试过了,这︰

var token = $('[name="_token"]').val();
this.$http.post('/prices', {_token:token})

但是什么都没有。 再次出现相同的错误。

如果我添加此:

http: {
    headers: {
  X-CSRF-TOKEN: document.querySelector('#token').getAttribute('content')
    }
},

页面加载时出现语法错误。

如果我更改为:

http: {
    headers: {
  Authorization: document.querySelector('#token').getAttribute('content')
    }
}

我再次收到内部服务器错误。

这是我的主要观点:

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

<script>
    window.Laravel = <?php echo json_encode([
        'csrfToken' => csrf_token(),
    ]); ?>
</script>

编辑:

如果我在x-csrf-token周围添加引号,但仍存在令牌不匹配错误,则此部分有效。

http: {
    headers: {
        'X-CSRF-TOKEN': document.querySelector('#token').getAttribute('content')
    }
},

我可能会弄错,但是在您的示例顶部,您有:

Vue.http.headers.common['X-CSRF-TOKEN'] = $('meta[name=_token]').attr('content');

但是,在主视图文件中,您具有:

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

您应该能够简单地将$('meta[name=_token]')更改$('meta[name=csrf-token]') (以便它们匹配)。

此外, X-CSRF-TOKEN: ...出现语法错误的原因是,除非在键名中使用连字符,否则您不能使用连字符,除非将它们用引号引起来,即'X-CSRF-TOKEN': ...

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM