为啥提交ajax请求时请求随机为空?

Posted

技术标签:

【中文标题】为啥提交ajax请求时请求随机为空?【英文标题】:Why is the requests randomly empty when submitting an ajax request?为什么提交ajax请求时请求随机为空? 【发布时间】:2018-08-29 09:35:59 【问题描述】:

问题

通过 ajax 发送的请求在控制器中为空,导致

为 foreach() 提供的参数无效

提交的大多数请求都没有问题,并且包含请求中预期的数据。该错误看似随机发生,即使复制收到错误的用户的输入,我们也无法重现该错误。

在将 Laravel Forge 从 php 7.0 更新到 PHP 7.1 后开始出现问题。一旦我们注意到错误,我们就降级到 PHP 7.0,但错误仍然存​​在。

我们所知道的

之间似乎没有关系 浏览器 浏览器版本 用户输入 请求通过 ajax 提交 控制器顶部的请求中没有数据

通过 ajax 发送数据的相关代码

简化的 html 格式

<form>
  <label>First name:</label>
  <input type="text" name="firstname">
  <label>Last name:</label>
  <input type="text" name="lastname">
</form> 

javascript

var signatureImageUrl = $("#jSignature").get(0).toDataURL();

$.ajax(
    method: "POST",
    url: "submit",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    data: 
        "visit_data": $("form").serializeArray()
    
);

控制器内抛出错误的相关代码

public function submit(Request $request) 
    try 
        foreach ($request->input('visit_data') as $index => $visitComponent) 
            // Iterates over data
        
     catch (\ErrorException $e) 
        // Handles error
    

问题

为什么在提交ajax请求时请求随机为空?

【问题讨论】:

鉴于问题,您需要尝试复制问题,直到它发生,您可以从浏览器的开发人员工具中收集更多信息。 (Cross-posted to Reddit). 【参考方案1】:

如果问题发生时无法查看客户的开发人员工具/控制台,几乎不可能回答问题。您可以做一些事情,这样用户就不会在他们的屏幕上看到一些奇怪的错误:

foreach() 需要一个数组并且正在发送一个空字符串。您应该在处理之前测试空虚:

if(!empty($request->input('visit_data')) 
    foreach ($request->input('visit_data') as $index => $visitComponent) 
        // Iterates over data
    

如果 AJAX 调用发送空请求,您可以添加额外检查以确保变量已设置且不为空:

if(isset($request->input('visit_data')) && !empty($request->input('visit_data')) 
    foreach ($request->input('visit_data') as $index => $visitComponent) 
        // Iterates over data
    

【讨论】:

当提交方法接收到非空请求时,$request-&gt;input('visit_data') 被迭代,没有问题。尽管没有解决遇到的问题,但您提出了一个有效的观点。 另外,foreach() 不应该收到空字符串。如果未填充 visit_data,则存在超出问题范围的 JS 验证会阻止 ajax 调用触发。 但是你说AJAX发送的是一个空请求?那么变量根本不存在@cody? 我们不确定这是 JS 还是 PHP 中的错误,但最终结果是控制器收到了一个空请求,希望这有助于澄清。当request 被打印出来时,它是一个空数组。 也引用原帖错误似乎是随机发生的,即使复制收到错误的用户的输入,我们也无法重现该错误。。根本问题是这个

以上是关于为啥提交ajax请求时请求随机为空?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 POST 不支持字符集,但 AJAX 请求可以?雄猫 6

为啥我的一个ajax请求总是被取消,回复data为空

为啥我的 Ajax 发布请求在表单提交中被阻止?

为啥用ajax发送post请求时,需要设置请求头类型为application/x-www-form-urlencoded

AJAX 请求正文为空(无 jQuery)

为啥我的 api ajax 请求未定义?