使用post方法的Api.php中的路由数据表的ajax问题

时间:2019-04-11 14:53:46

标签: ajax laravel datatables

我无法让我的DataTable通过Api.php类型POST中的路由加载数据。

我正在使用以下数据表:https://datatables.net/

Api.php

Route::post('subredes/{username}/{token}', function($username, $token){
    $user = DB::table('usuarios')
                    ->where('token', $token)
                    ->value('username');
    $estado = DB::table('usuarios')
                    ->where('username', $username)
                    ->value('estado');  

    if(!empty(trim($user)) && $estado == 2){
        $query = DB::table('subredes as s')
            ->select('s.id', 's.ip', 's.gateway', 's.mask');

        return datatables()
            ->of($query)
            ->addColumn('btn','Actions.subredes')
            ->rawColumns(['btn'])
            ->toJson();
    }

});

JavaScript

    $(document).ready(function(){
        $('#Subredes').DataTable({
        "bAutoWidth": false,
        "language":{
            "url": "{{url('api/spanish')}}"
        },
        "destroy": true,
        "responsive": true,
        "serverSide":true,
        "ajax": {
            "url": "{{url('api/subredes/'.auth()->user()->username.'/'.auth()->user()->token)}}",
            "type": "POST",
        },
        "columnDefs": [{
        "targets": 'no-sort',
        "orderable": false,
        "searchable": false,
        }],
        "columns":[
            {data: 'ip', name: 's.ip'},
            {data: 'gateway', name: 's.gateway'},
            {data: 'mask', name: 's.mask'},
            {data: 'btn'},
        ]
        });
    });

错误:

enter image description here

我怀疑这是因为他没有给他CSRF,但我不知道该怎么做,而且我不确定100%就是这个问题。

1 个答案:

答案 0 :(得分:1)

问题在于DataTables正在发出GET请求,而您仅允许POST。错误出在ajax配置中:您必须将type替换为method,它将以POST的形式发送。

来源:https://api.jquery.com/jQuery.ajax/

CSRF令牌将是您的下一个问题。最简单的方法是使用GET而不是post(在DataTables配置和Route配置中)。否则,您将必须在HTML中的某个位置公开令牌(例如,元标记),然后将其与请求一起发送:

    let token = document.head.querySelector('meta[name="csrf-token"]');
    //...
        "ajax": {
            "url": "{{url('api/subredes/'.auth()->user()->username.'/'.auth()->user()->token)}}",
            "method": "POST",
            "data": {
                _token: token,
        },