Laravel 5.5 Пытаюсь запустить тестовый пример вот отсюда: https://webformyself.com/laravel-ajax/ Но он не работает. В логе веб-сервера вижу, что POST-запрос приходит. В браузере вижу, что Laravel попыталась обработать AJAX-запрос, но не смогла. Ответное сообщение приходит, но не с маленьким JSON-ответом, а с портянкой ошибки. Судя по портянке, до контроллера выполнение не доходит, потому что нет никакого упоминания про AjaxController.php. То есть, что-то происходит в глубинах Laravel, но я не могу понять что. Вопрос: как заставить работать этот пример? Код ответного сообщения: Код (Text): { "message": "", "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException", "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php", "line": 203, "trace": [ { "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php", "line": 175, "function": "prepareException", "class": "Illuminate\\Foundation\\Exceptions\\Handler", "type": "->" }, { "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/app/Exceptions/Handler.php", "line": 51, "function": "render", "class": "Illuminate\\Foundation\\Exceptions\\Handler", "type": "->" }, ... Полная версия: https://pastebin.com/ZJUbZdTB - форум портянку не пропускает.
Статус такой: Request Method: POST Status Code: 419 unknown status Remote Address: 127.0.0.1:80 Referrer Policy: no-referrer-when-downgrade Дык воде отправляется csrf_token() в Ajax запросе: Код (Text): <script> functiongetMessage(){ $.ajax({ type:'POST', url:'/getmsg', data:'_token = <?php echo csrf_token() ?>', success:function(data){ $("#msg").html(data.msg); } }); } </script> Я проверял, данные формируются с реальным токеном. Только вот неясно, может ли Laravel понять CSFR токен, переданный в теле запроса в поле data. Этой информации я найти не могу. --- Добавлено --- Я в JS еще вначале добавил добавил: Код (Text): $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); Вот отсюда взял: https://laravel.com/docs/5.5/csrf Но толку никакого. --- Добавлено --- В логе чисто. Ответ возвращается ошибочный (419), но в логе по этому поводу ничего нет. Лог вообще не меняется при работе этого примера.
А метатег добавил? Раз 419, то 90%, что в токене прикол. --- Добавлено --- Покажи заголовок запроса из панели браузера Спойлер: Пример
Все заработало. Помимо кода с X-CSRF-TOKEN надо было еще добавить: Код (Text): <meta name="csrf-token" content="{{ csrf_token() }}"> И вид надо было переименовать с message.php на message.blade.php. После этого и заработало. Меня смутила фраза "By default, the resources/assets/js/bootstrap.js file registers the value of the csrf-token meta tag with the Axios HTTP library.". В зависимостях axio прописан: Код (Text): "devDependencies": { "axios": "^0.17", ... Но почему-то эту переменную не регистрирует, приходится прописывать вручную.
Ну так он для axios регистрирует, и это дело ещё собирать надо Laravel пропагандирует использование на фронте Vue и Axios, но, разумеется, это не обязательно. А если используешь jQuery, то надо руками прописывать, да. Статья, видимо о несколько устаревшей версии Laravel. --- Добавлено --- 5.5 кстати тоже уже устарела
И еще по данной теме. Передавать токен в данных запроса смысла не имеет: Код (Text): data:'_token = <?php echo csrf_token() ?>', Походу, нынешние версии Laravel такого не понимают. Дастоточно токена в заголовке, в поле 'X-CSRF-TOKEN'.