Laravel 5 - Ajax POST - $ request-> all () возвращает пустой массив в PostController - PullRequest
0 голосов
/ 24 августа 2018

Извиняюсь за повторение, но я пробовал каждое предложение на каждый вопрос, даже смутно похожий на этот, без конца.

ajax post:

    var contactForm = $('#contactForm');
    contactForm.on('submit', (event) => {
        event.preventDefault()

        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content')
            }
        })
        console.log(contactForm.serializeArray())
        $.ajax({
            dataType: "json",
            method : 'POST',
            url : 'contact-us/post',
            data : contactForm.serializeArray(),
            success: (res) => {
                console.log(res)
            }
        })
    })

Пост обработки маршрута:

    Route::post('contact-us/post', 'EnquiryPostController@store');

Метод хранения PostController:

    public function store(Request $request)
    {
        return response()->json(['success'=>$request->all()]);
    }

Вывод на консоль

заголовок ответа на вкладке сети

заголовок запроса из вкладки сети

из данных из вкладки сети

ОБНОВЛЕНИЕ:

Просто дляуточнить:

  • Я передаю токен CSRF.
  • Входные данные формы имеют атрибуты имени.
  • PostController получает запрос POST, но просто не содержит никакихданные формы.
  • Эта проблема возникает с AJAX POST и обычной старой формой POST

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Вы можете использовать приведенное ниже решение для отправки данных:

data : contactForm.serialize()
0 голосов
/ 13 сентября 2018

Оказывается, это была не проблема Laravel, а проблема Windows Server / web.config. Я бы настроил свой сайт, используя найденный XML здесь . После долгих проб и ошибок проблема была решена с использованием этого XML:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <ModSecurity enabled="true" configFile="c:\inetpub\wwwroot\modsecurity.conf" />
        <httpErrors errorMode="Detailed" />
        <modules runAllManagedModulesForAllRequests="true" />
        <defaultDocument>
            <files>
                <clear />
                <add value="index.php" />
            </files>
        </defaultDocument>
        <rewrite>
            <rules>
                <rule name="CanonicalHostNameRule1">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^dev\.financialservicesexpo\.co\.uk$" negate="true" />
                    </conditions>
                    <action type="Redirect" url="http://dev.financialservicesexpo.co.uk/{R:1}" />
                </rule>
                <rule name="default" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/index.php" />
                </rule>
            </rules>
        </rewrite>
        <staticContent>
            <clientCache cacheControlMaxAge="8.00:00:00" cacheControlMode="UseMaxAge"/>
        </staticContent>
    </system.webServer>
</configuration>

Хотелось бы объяснить, почему это решило проблему, но я очень плохо понимаю конфигурацию сервера. Если кто-то захочет прокомментировать с пониманием, я по крайней мере нахожу это интересным.

ЕСЛИ ЭТО НЕ ПОМОГЛО, ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ НИЖЕ

Чтобы разобраться с этой проблемой, пришлось попробовать множество различных решений, найденных в еще большем количестве вопросов, размещенных в StackOverflow, и т. Д., И в конечном итоге она была решена через две минуты после разговора с коллегой и проработки этой проблемы вслух. Разочаровывающий урок, который мне постоянно нужно учить ... Итак, в надежде, что это поможет другим, вот список вышеупомянутых решений, которые вы должны проверить.

  • Проверьте, что входные данные формы имеют атрибуты имени.
  • Очистить кеш браузера.
  • Очистить данные кэша Laravel.
  • Перезагрузить сайт
  • При использовании AJAX попробуйте и serialize (), и serializeArray ()
  • При использовании AJAX попробуйте отправить с разными типами данных и типами контента. По умолчанию должно быть хорошо, но стоит кричать, если вы делаете что-то другое.
  • CSRF-токен: добавьте его через скрытое поле ввода или задайте в заголовке запроса. Нужен только один.
  • Убедитесь, что в папках / storage и / bootstrap включены права чтения / записи.

Если у кого-нибудь есть какие-либо предложения или исправления в отношении того, что я здесь написал, пожалуйста, говорите. Я далеко не эксперт.

0 голосов
/ 24 августа 2018

Попробуйте в своем ajax-запросе использовать type вместо method, как

    $.ajax({
            dataType: "json",
            type : 'POST',
            url : 'contact-us/post',
            data : contactForm.serializeArray(),
            success: (res) => {
                console.log(res)
            }
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...