Laravel 5-Ajax POST-$ request-> all()在PostController中返回空数组

时间:2018-08-24 14:07:50

标签: ajax laravel http-post

道歉,但我已经尝试过对每个问题的每条建议,甚至与此几乎毫无疑问。

ajax帖子:

    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()]);
    }

Console output

response header from network tab

request header from network tab

from data from network tab

更新:

只需要澄清一下:

  • 我正在传递CSRF令牌。
  • 表单输入具有名称属性。
  • PostController正在接收POST请求,但根本不包含任何表单数据。
  • 此问题发生在AJAX POST和常规旧表格POST

3 个答案:

答案 0 :(得分:0)

使用type代替

method来尝试ajax请求
    $.ajax({
            dataType: "json",
            type : 'POST',
            url : 'contact-us/post',
            data : contactForm.serializeArray(),
            success: (res) => {
                console.log(res)
            }
    })

答案 1 :(得分:0)

您可以使用以下解决方案发送数据:

data : contactForm.serialize()

答案 2 :(得分:0)

结果证明这不是Laravel问题,而是Windows Server / web.config问题。我将使用发现的here 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时,请尝试使用不同的DataType和ContentType提交。默认值应该很好,但是如果您做不同的事情,则值得大喊。
  • CSRF令牌:通过隐藏的输入字段或在请求标头中设置添加令牌。只需要一个。
  • 确保/ storage和/ bootstrap文件夹已启用读/写权限。

如果有人对我在这里写的内容有任何建议或更正,请大声说出来。我绝对不是专家。