【问题标题】:$request->ajax() always returns false$request->ajax() 总是返回 false
【发布时间】:2020-02-10 14:15:20
【问题描述】:

我遇到了一种奇怪的行为,完全不知道为什么以及如何解决它。我是 PHP/Laravel/Ajax 的新手,所以请多多关照 ^^

我的刀锋形态:

<form method="post" action="{{ route('postContact') }}" id="id_post_contact">
    @csrf
    <input class="form-control" type="text" name="in_email" placeholder="contact@email.com">
    [...]
    <button class="btn" type="submit">Submit Question</button>
</form>

<div>
    <script>
        $("#id_post_contact").submit(function(e) {
            e.preventDefault();

            var form = $(this);
            var url = form.attr('action');
            var data2Send = form.serialize();

            $.ajax({
                type:'POST',
                url:url,
                headers:{
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
                },
                data:data2Send,
                dataType:'JSON',
                cache:false,
                //contentType:'application/json',
                success: function(data) {
                    alert(data.success);
                }
            });
        });
    </script>
</div>

我的路线:

Route::post('/contact', 'BasisController@postContactEmail')->name('postContact');

我的控制器 postContactEmail 方法:

public function postContactEmail(Request $req){
    dd(
        $req->ajax(),
        $req->isXmlHttpRequest(),
        $req->all()
    );

    return response()->json(['success' => 'Got Simple Ajax Request.']);
}

出于我忽略的原因,我的 $req->ajax() 总是返回 false

在这里问我的第一个问题之前,我已经尝试了很多东西,但没有任何效果,尤其是同样的代码到现在都运行良好,所以我真的一点头绪都没有。

唯一不同的是我的 Laravel 版本已从 5.8 更改为 6.2。

我不知道为什么我的表单没有正确发送数据,我的标头请求:

Accept  
text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Encoding 
gzip, deflate, br
Accept-Language 
fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Connection  
keep-alive
Content-Length  
149
Content-Type    
application/x-www-form-urlencoded
Cookie  
__cfduid=da74c7ad6c9ff7514e482…E_OPTINVEST_CONSENT=1; _gat=1
Host    
fake-site.tld
Referer 
https://fake-site.tld/
TE  
Trailers
Upgrade-Insecure-Requests   
1
User-Agent  
Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/69.0

还有我的标题响应:

cf-cache-status 
DYNAMIC
cf-ray  
5254def1febccdd7-CDG
content-encoding    
br
content-type    
text/html; charset=UTF-8
date    
Sun, 13 Oct 2019 22:50:09 GMT
expect-ct   
max-age=604800, report-uri="ht….com/cdn-cgi/beacon/expect-ct"
server  
cloudflare
vary    
Accept-Encoding
X-Firefox-Spdy  
h2

P.S.:我的 jquery 版本是 2.2.4(即使是 3.4.1 版本,行为也是一样的,$req->ajax() 总是会返回 false

【问题讨论】:

  • 能否提供来自浏览器Network 控制台的请求标头屏幕截图?这比试图理解问题中复制的文本更容易
  • 我只是注意到您的评论^^会尽快处理,谢谢

标签: jquery ajax laravel laravel-blade


【解决方案1】:

谢谢你们=)

在这里暴露我的问题也有助于我解决它们^^

我只通过在主布局中“推送”ajax 脚本来解决我的问题,最后,在标记之前,如下所示:

<form method="post" action="{{ route('postContact') }}" id="id_post_contact">
    @csrf
    <input class="form-control" type="text" name="in_email" placeholder="contact@email.com">
    [...]
    <button class="btn" type="submit">Submit Question</button>
</form>

@push('stack_js_foot')
    <script>
        $("#id_post_contact").submit(function(e) {
            e.preventDefault();

            var form = $(this);
            var url = form.attr('action');
            var data2Send = form.serialize();

            $.ajax({
                type:'POST',
                url:url,
                headers:{
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
                },
                data:data2Send,
                dataType:'JSON',
                cache:false,
                //contentType:'application/json',
                success: function(data) {
                    alert(data.success);
                }
            });
        });
    </script>
@endpush

从我的角度来看,我仍然不理解这种行为......我一直认为我们可以在任何地方触发/声明 javascript,只要它被封装在标签中。这就是我到目前为止所做的(成功)

如果有人知道原因,我会很乐意倾听/学习 =)

再次感谢您的帮助

【讨论】:

  • 在脚本运行之前,可能并非所有 DOM 节点都已初始化。这就是为什么 web 开发人员通常将他们的 js 包含在加载 DOM 时调用的其他文件中的原因。有关该检查的更多信息,请查看 window.onload、$(document).ready 和 window.domcontentloaded
【解决方案2】:

看起来您没有提供 X-Requested-With 标头,而 Request::ajax 只是检查此标头的存在(或至少过去曾经。)

看看这个问题:Laravel angularjs Request::ajax() always false

请参阅此问题以提供带有jQuery.ajax 的标头:Cross-Domain AJAX doesn't send X-Requested-With header

【讨论】:

  • OP 正在使用 jQuery,它肯定包含该标头
  • 如果 jQuery 认为请求是跨域的,则不一定。无论如何,我在提供的请求标头 OP 中没有看到它。
  • 公平通话。这里的所有内容看起来都应该被视为同域请求。
  • 感谢您的回复,我会检查 ^^ 关于 X-Requested-With 我试图强制它,但我的尝试都没有奏效,出于某种原因,我忽略,标头继续发送没有 X-Requested-With 标头的发布请求:/ 顺便说一句,我现在记得另一个区别。在 laravel 5.8 上,我使用了与 laravel 6.2 不再兼容的 Laravel Force Https package 也许这里是重点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多