Почему мой маршрут возвращает ошибку 404 Laravel? - PullRequest
0 голосов
/ 03 июля 2018

В настоящее время я пытаюсь сделать 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 и ошибка 404 для маршрута mydevsite.dev/products/parse в консоли разработчика Chrome.

Я подумал, что мне нужно определить маршрут, поэтому я добавил:

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

Что возвращает

return view('products.parse');

Но это просто меняет мою ошибку на 419. Я думаю, что это как-то связано с полем CSRF, но я не уверен, как включить это, потому что мой HTML не является формой, а просто имеет элементы формы , Почему мой маршрут возвращает ошибку 404 или 419 и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы публикуете неправильный URL.

Должно быть так:

var url="/products/parse";

и вам также необходимо отправить токен CSRF (иначе это приведет к ошибке 419), которая описана здесь :

поместите этот метатег внутри вашего <head> тега:

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

Затем получите доступ к нему с помощью jQuery, как это:

$('meta[name="csrf-token"]').attr('content')
0 голосов
/ 03 июля 2018

Вы попали по неверному маршруту. Эта переменная

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
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...