За последние 24 часа нас посетили 22533 программиста и 1277 роботов. Сейчас ищут 842 программиста ...

Laravel генерирует ошибку при обработке AJAX-запроса

Тема в разделе "Laravel", создана пользователем xintrea, 11 апр 2019.

  1. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Laravel 5.5

    Пытаюсь запустить тестовый пример вот отсюда:

    https://webformyself.com/laravel-ajax/

    Но он не работает.

    В логе веб-сервера вижу, что POST-запрос приходит. В браузере вижу, что Laravel попыталась обработать AJAX-запрос, но не смогла. Ответное сообщение приходит, но не с маленьким JSON-ответом, а с портянкой ошибки.

    Судя по портянке, до контроллера выполнение не доходит, потому что нет никакого упоминания про AjaxController.php. То есть, что-то происходит в глубинах Laravel, но я не могу понять что.

    Вопрос: как заставить работать этот пример?

    Код ответного сообщения:

    Код (Text):
    1.  
    2. {
    3.   "message": "",
    4.   "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",
    5.   "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",
    6.   "line": 203,
    7.   "trace": [
    8.   {
    9.   "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",
    10.   "line": 175,
    11.   "function": "prepareException",
    12.   "class": "Illuminate\\Foundation\\Exceptions\\Handler",
    13.   "type": "->"
    14.   },
    15.   {
    16.   "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/app/Exceptions/Handler.php",
    17.   "line": 51,
    18.   "function": "render",
    19.   "class": "Illuminate\\Foundation\\Exceptions\\Handler",
    20.   "type": "->"
    21.   },
    22. ...
    Полная версия: https://pastebin.com/ZJUbZdTB - форум портянку не пропускает.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А что в логе Laravel? (папка storage/logs)
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    статус ответа какой? 417 ?
    мб CSRF?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @ADSoft Да там токен подставляют вроде в примере. И 419, а не 417, если неверный токен :)
     
  5. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Статус такой:
    1. Request Method:
      POST
    2. Status Code:
      419 unknown status
    3. Remote Address:
      127.0.0.1:80
    4. Referrer Policy:
      no-referrer-when-downgrade

    Дык воде отправляется csrf_token() в Ajax запросе:

    Код (Text):
    1.  
    2.   <script>
    3. functiongetMessage(){
    4.   $.ajax({
    5. type:'POST',
    6. url:'/getmsg',
    7. data:'_token = <?php echo csrf_token() ?>',
    8. success:function(data){
    9.   $("#msg").html(data.msg);
    10. }
    11.   });
    12. }
    13.   </script>
    Я проверял, данные формируются с реальным токеном. Только вот неясно, может ли Laravel понять CSFR токен, переданный в теле запроса в поле data. Этой информации я найти не могу.
    --- Добавлено ---
    Я в JS еще вначале добавил добавил:

    Код (Text):
    1.  
    2.   $.ajaxSetup({
    3.   headers: {
    4.   'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    5.   }
    6.   });
    Вот отсюда взял: https://laravel.com/docs/5.5/csrf

    Но толку никакого.
    --- Добавлено ---
    В логе чисто. Ответ возвращается ошибочный (419), но в логе по этому поводу ничего нет. Лог вообще не меняется при работе этого примера.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А метатег добавил? Раз 419, то 90%, что в токене прикол.
    --- Добавлено ---
    Покажи заголовок запроса из панели браузера
    upload_2019-4-11_15-57-0.png
     
  7. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Все заработало.

    Помимо кода с X-CSRF-TOKEN надо было еще добавить:
    Код (Text):
    1.  
    2. <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):
    1.  
    2. "devDependencies": {
    3.  "axios": "^0.17",
    4. ...
    Но почему-то эту переменную не регистрирует, приходится прописывать вручную.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну так он для axios регистрирует, и это дело ещё собирать надо :)

    Laravel пропагандирует использование на фронте Vue и Axios, но, разумеется, это не обязательно. А если используешь jQuery, то надо руками прописывать, да.

    Статья, видимо о несколько устаревшей версии Laravel.
    --- Добавлено ---
    5.5 кстати тоже уже устарела
     
  9. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    И еще по данной теме.

    Передавать токен в данных запроса смысла не имеет:

    Код (Text):
    1.  
    2. data:'_token = <?php echo csrf_token() ?>',
    Походу, нынешние версии Laravel такого не понимают. Дастоточно токена в заголовке, в поле 'X-CSRF-TOKEN'.