我目前正在尝试针对某种形式的帖子提出AJAX请求,但是我尝试向其发送数据的PHP解析脚本返回了404错误,该错误可以通过Chrome开发者工具看到。这是我的代码:
<script type="text/javascript">
function ajax_post(){
var hr = new XMLHttpRequest();
var url = "/products/parse.blade.php";
var productName = document.getElementById("productName").value;
var quantityInStock = document.getElementById("quantityInStock").value;
var pricePerItem = document.getElementById("pricePerItem").value;
var totalValueNumber = quantityInStock * pricePerItem;
var route = "productName="+productName;
hr.open("POST", url, true);
hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
hr.onreadystatechange = function() {
if(hr.readyState == 4 && hr.status == 200) {
var return_data = hr.responseText;
document.getElementById("status").innerHTML = return_data;
}
}
hr.send(route);
document.getElementById("status").innerHTML = "processing...";
}
</script>
<div class="container-fluid form-container">
<div class="row">
<div class="col-lg-3 col-md-12">
<div class="form-group">
<input type="text" name="productName" id="productName" placeholder="Product Name" class="form-control" required>
</div>
<div class="form-group">
<input type="number" name="quantityInStock" id="quantityInStock" placeholder="Quantity in Stock" class="form-control" required>
</div>
<div class="form-group">
<input type="number" step="0.01" name="pricePerItem" id="pricePerItem" placeholder="Price per Item" class="form-control" required>
</div>
<input type="submit" value="Create Product Listing" class="btn btn-primary" onclick="ajax_post();">
<hr>
<div id="status"></div>
</div>
</div>
</div>
我正在使用Laravel,这个视图products.create
和我试图用来解析数据的文件products.parse
都在我的views文件夹的products
目录中。但是,当我尝试提交时,我得到的只是状态div中“处理”的响应,以及Chrome开发者控制台中路由mydevsite.dev/products/parse
的404错误。
我认为我需要定义一条路线,所以我添加了:
Route::post('/products/parse', 'ProductController@parse');
哪个返回
return view('products.parse');
但是这只是将我的错误更改为419。我认为它与CSRF字段有关,但是我不确定如何将其包括在内,因为它不是HTML表单,而只是具有表单元素。为什么我的路线返回404或419错误,该如何解决?
答案 0 :(得分:2)
您发布到错误的URL。
必须是这样的:
var url="/products/parse";
,您还需要发送CSRF令牌(否则将导致419错误),其描述为here:
将此元标记放在您的<head>
标记内:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后通过jQuery这样访问它:
$('meta[name="csrf-token"]').attr('content')
答案 1 :(得分:1)
您打错了路线。这个变量
var url = "/products/parse.blade.php";
应该是这个
var url = "/products/parse";
您要调用此处定义的路由
Route::post('/products/parse', 'ProductController@parse');
您正在尝试调用路由返回的刀片文件,但这不是正确的方法。另外,该文件不在您的公共目录中。
您可以尝试使用fetch。看起来像这样:
document.getElementById("status").innerHTML = 'processing...'
let form = new FormData()
form.set('one', '1')
form.set('two', '2')
fetch(url, {
method: 'POST',
// Credentials may or may not be required.
// It depends if cookies are needed or not.
credentials: 'include',
body: form,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
}
}).then(response => response.text())
.then(text => {
document.getElementById("status").innerHTML = text
})