Laravel 5: Ajax Post 500 (Внутренняя ошибка сервера)

Я пытаюсь отправить данные в базу данных через ajax. На странице статьи статьи отлично работает без ajax. Я добавил console.log() чтобы увидеть, что-то происходит, но вместо этого я получаю эту ошибку:

POST http: // localhost / laravel-5 / public / articles / create 500 (Внутренняя ошибка сервера)

Что случилось с моим кодом? Это javascript или контроллер?

EDIT: Я получаю это в laravel.log

исключение «Illuminate \ Session \ TokenMismatchException» в C: \ xampp \ htdocs \ laravel-5 \ vendor \ laravel \ framework \ src \ Illuminate \ Foundation \ Http \ Middleware \ VerifyCsrfToken.php: 53

маршрут

 Route::resource('articles', 'ArticlesController'); 

контроллер

 public function store(Requests\ArticleRequest $request) { $article = new Article($request->all()); Auth::user()->articles()->save($article); $response = array( 'status' => 'success', 'msg' => 'Article has been posted.', ); return \Response::json($response); } 

JQuery

 $(document).ready(function() { $('#frm').on('submit', function (e) { e.preventDefault(); var title = $('#title').val(); var body = $('#body').val(); var published_at = $('#published_at').val(); $.ajax({ type: "POST", url: 'http://localhost/laravel-5/public/articles/create', dataType: 'JSON', data: {title: title, body: body, published_at: published_at}, success: function( data ) { $("#ajaxResponse").append(data.msg); console.log(data); } }); }); 

Посмотреть

 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <h1>Write a New Article</h1> <hr> {!! Form::open(['url' => 'articles', 'id' => 'frm']) !!} <p> {!! Form::label('title', 'Title:') !!} {!! Form::text('title') !!} </p> <p> {!! Form::label('body', 'Body:') !!} {!! Form::textarea('body') !!} </p> <p> {!! Form::label('published_at', 'Date:') !!} {!! Form::input('date', 'published_at', date('Ym-d'), ['class' => 'form-control']) !!} </p> <p> {!! Form::submit('Submit Article', ['id' => 'submit']) !!} </p> {!! Form::close() !!} <h3 id="ajaxResponse"></h3> @if($errors->any()) <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> @endif <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <script src="{{ URL::asset('assets/js/ArticleCreate.js') }}"></script> 

});

Когда вы отправляете запрос через POST на контроллер ресурсов, он автоматически вызывает метод хранилища:

 Verb Path Action Route Name ---------------------------------- POST /articles store articles.store 

Итак, вам просто нужно изменить URL-адрес ajax:

 $.ajax({ type: "POST", url: 'http://localhost/laravel-5/public/articles', 

Когда вам нужно отправить токен сеанса, вы можете добавить глобальный метатег, например, это ваш веб-сайт:

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

Затем просто добавьте токен через заголовки ajax:

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

Если вы используете функцию Form::open() (LaravelCollective), она добавляет скрытый ввод с токеном как значение с именем _token . Таким образом, вы можете удалить метатег и отредактировать заголовки ajax следующим образом:

 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('[name="_token"]').val() } }); 

Вот что я получил исключение «Illuminate \ Session \ TokenMismatchException» в C: \ xampp \ htdocs \ laravel-5 \ vendor \ laravel \ framework \ src \ Illuminate \ Foundation \ Htt p \ Middleware \ VerifyCsrfToken.php: 53

Вы попадаете в защиту CSRF от Laravel.

http://laravel.com/docs/5.1/routing#csrf-protection

Вам нужно передать значение скрытого _token поля _token . Это можно сделать автоматически во всех запросах AJAX, инициированных jQuery, выполнив это в JS вашего приложения:

 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('input[name="_token"]').value() } }); 

Или вы можете вручную извлечь и передать значение скрытого поля _token в каждом из ваших вызовов AJAX.

Мне нравится делиться этим кодом, чтобы помочь кому-то понадобиться ajax-сообщение и получить с laravel

 <<<<<<<< POST <<<< <<look after @extends<< <<look beforeSend: function (xhr) << <<look use Illuminate\Http\Request in Routes<< <<<------<<views\login\login.blade.php<<<<-----------<<< @extends('cuerpito.web') <meta name="csrf_token" content="{{ csrf_token() }}" /> @section('content') <form action="#" id="logForm" method="post" class="form-horizontal"> <div class="form-group"> <div class="col-xs-12"> <div class="input-group"> <input type="email" id="email" name="email" class="form-control input-lg" placeholder="Ingresa tu Email." autocomplete="off"> </div> </div> </div> <div class="form-group"> <div class="col-xs-12"> <div class="input-group"> <input type="password" id="password" name="password" class="form-control input-lg" placeholder="Ingresa tu Contraseña." autocomplete="off"> </div> </div> </div> <div class="form-group formSubmit"> <div class="col-xs-12"> <div class="input-group"> <button type="submit" name="feedbackSubmit" id="feedbackSubmit" class="btn btn-success btn-lg" style="display: block; margin-top: 10px;">Ingresar</button> </div> </div> </div> </form> <script type="text/javascript"> $(document).ready(function () { $("#feedbackSubmit").click(function () { $.ajax({ url: '{{URL::route('login4')}}', type: "post", beforeSend: function (xhr) { var token = $('meta[name="csrf_token"]').attr('content'); if (token) { return xhr.setRequestHeader('X-CSRF-TOKEN', token); } }, data: $("#logForm").serialize(), success: function (data) { if (data) { alert(data); console.log(data); } else { console.log(data); }//else }//success });//ajax return false; });//feedbacksubmit });//document ready </script> -------------0---------------------- -------------0---------------------- <<<----<<app\Http\routes.php<<<<-----------<<< <?php use Illuminate\Http\Request; Route::post('login4', function() { return 'Success! POST Ajax in laravel 5'; })->name('login4'); ------------------0---------------------- ------------------0---------------------- <<<< Get <<look after @extends<< <<look beforeSend: function (xhr) << <<look use Illuminate\Http\Request in Routes<< <<<------<<views\login\login.blade.php<<<<-----------<<< @extends('cuerpito.web') <meta name="csrf_token" content="{{ csrf_token() }}" /> @section('content') <form action="#" id="logForm" method="post" class="form-horizontal"> <div class="form-group"> <div class="col-xs-12"> <div class="input-group"> <input type="email" id="email" name="email" class="form-control input-lg" placeholder="Ingresa tu Email." autocomplete="off"> </div> </div> </div> <div class="form-group"> <div class="col-xs-12"> <div class="input-group"> <input type="password" id="password" name="password" class="form-control input-lg" placeholder="Ingresa tu Contraseña." autocomplete="off"> </div> </div> </div> <div class="form-group formSubmit"> <div class="col-xs-12"> <div class="input-group"> <button type="submit" name="feedbackSubmit" id="feedbackSubmit" class="btn btn-success btn-lg" style="display: block; margin-top: 10px;">Ingresar</button> </div> </div> </div> </form> <script type="text/javascript"> $(document).ready(function () { $("#feedbackSubmit").click(function () { $.ajax({ url: '{{URL::route('login2')}}', type: "get", beforeSend: function (xhr) { var token = $('meta[name="csrf_token"]').attr('content'); if (token) { return xhr.setRequestHeader('X-CSRF-TOKEN', token); } }, data: $("#logForm").serialize(), success: function (data) { if (data) { obj = JSON.stringify(data, null, " "); var datito = JSON.parse(obj); console.log(datito.response); alert(datito.response); } else { console.log(data); }//else }//success });//ajax return false; });//feedbacksubmit });//document ready </script> -------------0---------------------- -------------0---------------------- <<<----<<app\Http\routes.php<<<<-----------<<< <?php use Illuminate\Http\Request; Route::get('login2', 'WebController@login2')->name('login2'); -------------0---------------------- -------------0---------------------- <<<----<<Http\Controllers\WebController.php<<<<-----------<<< public function login2(Request $datos) { if ($datos->isMethod('get')) { return response()->json(['response' => 'This is get method']); } return response()->json(['response' => 'This is post method']); } -------------0---------------------- -------------0---------------------- 

Вы можете добавить свои URL-адреса в промежуточное ПО VerifyCsrfToken.php. URL-адреса будут исключены из проверки CSRF:

 protected $except = [ "your url", "your url/abc" ]; 

Ну, если вы ищете ответ верного выстрела, вот он: эта ошибка возникает, особенно если вы не видите csrf_token () в коде. Вот что я сделал,

 <h6>ITEMS ORDERED:<a href="#" id="{{$post->identifier}}" onclick="getcart(this.id)">CLICK HERE</a></h6> <input type="hidden" id="token" value="{{ csrf_token() }}"> 

Теперь с Ajax

 <script type="text/javascript"> function getcart(val) { var alpha=val; var token=document.getElementById('token').value; $.ajax({ type:'post', url:'/private/getcart', data:{'alpha':alpha,'_token': token},//this _token should be as it is success:function (result) { alert(result); } }); } </script> 

В моем контроллере laravel

 public function getcart(Request $req) { return response ("its"); }