Я пытаюсь отправить данные в базу данных через ajax. На странице статьи статьи отлично работает без ajax. Я добавил console.log()
чтобы увидеть, что-то происходит, но вместо этого я получаю эту ошибку:
POST http: // localhost / laravel-5 / public / articles / create 500 (Внутренняя ошибка сервера)
- Использовать функцию иногда () в классе запросов Laravel 5
- Laravel 5 Сессия, работающая в Postman, не работает, если вызвана из браузера
- Laravel 5: проверьте, принадлежит ли пользователю список модераторов, прежде чем разрешить ему редактировать
- Обновление Laravel 5.2 - класс AuthServiceProvider не найден
- расширение laravel 5 встроенной аутентификации для входа в систему только "если пользователь == активен"
Что случилось с моим кодом? Это 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"); }