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

问题描述 投票:-1回答:3

抱歉重复,但我已经尝试了每个问题的每一个建议,甚至模糊地类似于这个到最后。

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会出现此问题
ajax laravel http-post
3个回答
1
投票

事实证明这不是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时,请尝试使用不同的数据类型和内容类型进行提交。默认应该没问题但是如果你做了不同的事情就值得大喊大叫。
  • CSRF令牌:通过隐藏的输入字段添加或在请求标头中设置。只需要一个。
  • 确保/ storage和/ bootstrap文件夹已启用读/写权限。

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


0
投票

尝试使用type代替method之类的ajax请求

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

0
投票

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

data : contactForm.serialize()
© www.soinside.com 2019 - 2024. All rights reserved.