如何在laravel和ajax中使用POST方法

时间:2017-08-28 03:26:59

标签: php ajax laravel-5

当我使用带有以下ajax请求的POST方法时,它会抛出一个"方法不允许"错误。如果我在不使用ajax的情况下使用表单POST,则会转到正确的方法。

在Router.php中:

 $this->post('TestPost','DashboardController@TestPostMethod');

在View中,ajax请求是:

$.ajax(
{           
type: "POST",
url: 'TestPost',
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
cache: false,
success: function (data) {  
alert('hid post');       

SetHotandWorstData(data,'hotquantity');

},

error: function (msg) {
alert('error');
alert(msg.responseText);
}
});

在控制器中:

function TestPostMethod(Request $request)
{
    $hotworstsalesdata = DB::table('100_INVOICEDETAIL')              
    ->select( '100_INVOICEDETAIL.ITEMCODE','100_INVOICEDETAIL.ITEMNAME',
DB::raw('SUM("100_INVOICEDETAIL"."QTY") as 
salesqty'), DB::raw('SUM("100_INVOICEDETAIL"."AMT") as salesamt'))
    ->groupBy('100_INVOICEDETAIL.ITEMCODE','100_INVOICEDETAIL.ITEMNAME')
    ->orderBy('salesqty')
    ->take(10)
    ->get();
    return Datatables::of($hotworstsalesdata)->make(true);
}

2 个答案:

答案 0 :(得分:4)

你应该在POST数据中传递“_token”。 Laravel使用令牌进行跨站点请求伪造(CSRF)攻击。在AJAX请求中使用以下代码

data: { _token: "{{ csrf_token() }}"  }

更新回答:

我已经使用laravel 5.4在我的系统上重新创建了相同的场景,它正在为我工​​作。

我的路线(web.php)代码是:

Route::post('/test_post', 'DashboardController@getData');

Javascript代码是:

<script type="text/javascript">
    $.ajax({
        type: "POST",
        url: '{{ url('/') }}/test_post',
        data: { _token: "{{ csrf_token() }}"  },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        cache: false,
        success: function (data) {
            console.log(data);
        },

        error: function (msg) {

            console.log(msg.responseText);
        }
    });
    </script> 

DashboardController文件是:

public function getData(Request $request) {
    print_r($request);      
}

答案 1 :(得分:0)

最近我用DELETE方法出错了!我通过在html标头中设置csrf token来修复并进入ajax。希望这可以解决你的问题..

<html>
<header>
<meta name="csrf-token" content="{{ csrf_token() }}" />

在ajax中,

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});