为啥我的路线返回 404 错误 Laravel?

Posted

技术标签:

【中文标题】为啥我的路线返回 404 错误 Laravel?【英文标题】:Why is my route returning 404 error Laravel?为什么我的路线返回 404 错误 Laravel? 【发布时间】:2018-12-11 22:46:42 【问题描述】:

我目前正在尝试为一种表单发布类型发出 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 都在我的视图文件夹的 products 目录中。但是,当我尝试提交时,我得到的只是状态 div 中的“处理”响应,以及 Chrome 开发控制台中路由 mydevsite.dev/products/parse 的 404 错误。

我认为我需要定义一条路线,所以我补充说:

Route::post('/products/parse', 'ProductController@parse'); 

返回

return view('products.parse');

但这只是将我的错误更改为 419。我认为它与 CSRF 字段有关,但我不确定如何包含它,因为我的 html 不是表单,而只是具有表单元素.为什么我的路由返回 404 或 419 错误,我该如何解决?

【问题讨论】:

【参考方案1】:

您发布到错误的网址。

一定是这样的:

var url="/products/parse";

您还需要发送 CSRF 令牌(否则会导致 419 错误),描述为 here :

将此元标记放入您的 &lt;head&gt; 标记中:

<meta name="csrf-token" content=" csrf_token() ">

然后像这样通过 jQuery 访问它:

$('meta[name="csrf-token"]').attr('content')

【讨论】:

CSRF 令牌不会导致 404 @GetOffMyLawn 是的,但是他没有发布 CSRF 令牌,所以会导致另一个问题。 并不总是需要 CSRF 令牌。 @GetOffMyLawn 显然,他没有编写 API,因此需要 CSRF 令牌,除非他禁用了 CSRF 保护【参考方案2】:

你走错路了。这个变量

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
  )

【讨论】:

@hoolakoola 你试过用fetchinestead 吗? @GetOffMyLawn 使用原始 XHR 不会导致 419 错误 :) 正如我所说,CRRF 令牌是问题 @HamidrezaKalantari 看起来你是对的***.com/questions/46472812/… @HamidrezaKalantari 是的,这就是问题所在,我添加了hr.setRequestHeader("X-CSRF-TOKEN", $('meta[name="csrf-token"]').attr('content')); 并解决了它。谢谢你们。

以上是关于为啥我的路线返回 404 错误 Laravel?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5:404 路线上的会话

在 laravel 中使用错误的 http 请求类型(例如 get 而不是 post)时返回 404

为啥我的路线返回 500 错误?

为啥我得到一个 404 到 laravel 5.7 公共子文件夹?

为啥我的 api 模拟返回 404 错误?

Laravel API 路由 - 404