我面临着一种奇怪的行为,根本不知道为什么以及如何解决它。我是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 )
答案 0 :(得分:0)
您似乎没有提供X-Requested-With
标头,而Request::ajax
只是检查了此标头的存在(或至少曾经有过。)
查看以下问题:Laravel angularjs Request::ajax() always false
有关为标题提供jQuery.ajax
:Cross-Domain AJAX doesn't send X-Requested-With header
答案 1 :(得分:0)
谢谢你们=)
在这里公开我的问题也有助于我解决它们^^
我通过仅将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,但只要将它封装在标记中,我总是可以的。那就是我到目前为止所做的(成功的)
如果有人知道为什么,我会很乐意听/学=)
再次感谢您的帮助