Laravel 5.5 ajax вызов 419 (неизвестный статус)



Я делаю вызов ajax, но я продолжаю получать эту ошибку:




419 (неизвестный статус)




не знаю, что вызывает это я видел на других постах он должен сделать что-то с CSRF токен, но у меня нет формы, поэтому я не знаю, как это исправить.



мой призыв:



$('.company-selector li > a').click(function(e) {
e.preventDefault();

var companyId = $(this).data("company-id");


$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
url: '/fetch-company/' + companyId,
dataType : 'json',
type: 'POST',
data: {},
contentType: false,
processData: false,
success:function(response) {
console.log(response);
}
});
});


маршрут:



Route::post('fetch-company/{companyId}', 'HomeController@fetchCompany');


мой метод контроллера



/**
* Fetches a company
*
* @param $companyId
*
* @return array
*/
public function fetchCompany($companyId)
{
$company = Company::where('id', $companyId)->first();

return response()->json($company);
}


конечная цель состоит в том, чтобы отобразить что-то из ответа в html элемент.

1030   12  

12 ответов:

используйте это в разделе head:

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

и получить маркер csrf в ajax:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

пожалуйста, обратитесь к документации Laravel csrf_token

другой способ решить эту проблему-использовать _token поле в ajax данных и установить значение {{csrf_token()}} в лезвие. Вот рабочий код, который я только что попробовал на моем конце.

$.ajax({
    type: "POST",
    url: '/your_url',
    data: { somefield: "Some field value", _token: '{{csrf_token()}}' },
    success: function (data) {
       console.log(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);

    },
});

это похоже на ответ Каннана. Однако это устраняет проблему, когда маркер не следует отправлять на междоменные сайты. Это будет только установить заголовок, если это локальный запрос.

HTML:

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

JS:

$.ajaxSetup({
    beforeSend: function(xhr, type) {
        if (!type.crossDomain) {
            xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
        }
    },
});

в моем случае я забыл добавить csrf_token вход в представленную форму. так что я сделал это HTML:

<form class="form-material" id="myform">
...
<input type="file" name="l_img" id="l_img">
<input type="hidden" id="_token" value="{{ csrf_token() }}">
..
</form>

JS:

//setting containers
        var _token = $('input#_token').val();
        var l_img = $('input#l_img').val();
        var formData = new FormData();
        formData.append("_token", _token);
        formData.append("l_img", $('#l_img')[0].files[0]);

        if(!l_img) {
            //do error if no image uploaded
            return false;
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "/my_url",
                contentType: false,
                processData: false,
                dataType: "json",
                data : formData,
                beforeSend: function()
                {
                    //do before send
                },
                success: function(data)
                {
                    //do success
                },
                error: function(jqXhr, textStatus, errorThrown) //jqXHR, textStatus, errorThrown
                {
                    if( jqXhr.status === "422" ) {
                        //do error
                    } else {
                        //do error
                    }
                }
            });
        }
        return false; //not to post the form physically

используйте это на своей странице

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

и в вашем ajax использовал его в данных:

_token: '{!! csrf_token() !!}',

что есть:

$.ajax({
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {
                   _token: '{!! csrf_token() !!}',
                 },
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });

спасибо.

возможно, ваш домен сеанса не соответствует URL-адресу вашего приложения и / или хосту, используемому для доступа к приложению.

1.) Проверьте ваш .env file:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Проверьте конфигурацию/сеанс.php

Проверьте значения, чтобы убедиться, что они верны.

даже если у вас есть csrf_token, Если вы не проверить подлинность ваших действий регулятора, используя фреймворк Laravel Policies вы можете иметь 419 ответ. В этом случае вы должны добавить необходимые функции политики в свой Policy класса.

Если вы уже сделали вышеуказанные предложения и все еще имеете проблему.

убедитесь, что переменная env:

SESSION_SECURE_COOKIE

установлено значение falseесли у вас нет SSL-сертификата, как на локальном.

при загрузке .js из файла вы должны установить переменную с csrf_token в вашем" main".лезвие.php-файл, в который вы импортируете .js и использовать переменную в вызове ajax.

.лезвие.php
...
...
<script src="{{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
        var token = '{{ csrf_token() }}';
</script>

другой файл.js

$.ajax({
    url: 'yourUrl',
    type: 'POST',
    data: {
        '_token': token
    },
    dataType: "json",
    beforeSend:function(){
        //do stuff
    },
    success: function(data) {
        //do stuff
    },
    error: function(data) {
        //do stuff
    },
    complete: function(){
        //do stuff
    }
});

некоторые рефы =>

...
<head>
    // CSRF for all ajax call
    <meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
 ...
 ...
<script>
    // CSRF for all ajax call
    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
...

просто сериализовать данные формы и получить ваши проблемы решены.

data: $('#form_id').serialize(),

вы должны получить маркер csrf..

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

после того, как вы сделаете ту же проблему ,просто добавьте этот мета-тег< meta name="csrf-token" content="{{ csrf_token() }}" >

после этого также возникает ошибка, вы можете проверить ошибку Ajax. Затем также проверьте ошибку Ajax

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

Comments

    Ничего не найдено.