Подтвердить что ты не робот

Сообщение ajax в laravel 5 возвращает ошибку 500 (Внутренняя ошибка сервера)

это мой тест ajax в laravel 5 (см. ниже)

$("#try").click(function(){
    var url = $(this).attr("data-link");
    $.ajax({
        url: "test",
        type:"POST",
        data: { testdata : 'testdatacontent' },
        success:function(data){
            alert(data);
        },error:function(){ 
            alert("error!!!!");
        }
    }); //end of ajax
});

и триггерное звено

<a href="#" id="try" data-link="{{ url('/test') }}">Try</a>

и мой маршрут

Route::post('test', function()
{
    return 'Success! ajax in laravel 5';
});

но это дает мне ошибку, когда я запускаю консоль в google chrome и не возвращает ожидаемый ответ "return" Success! ajax in laravel 5 '; "

POST http://juliver.laravel.com/test 500 (Внутренняя ошибка сервера)

Что не так/проблема с моим кодом? ничего не пропало?

4b9b3361

Ответ 1

Хотя этот вопрос существует некоторое время, но не принято никакого ответа, я бы хотел указать вам на решение. Поскольку вы отправляете с помощью ajax и, вероятно, по-прежнему используете промежуточное программное обеспечение CSRF, вам необходимо предоставить дополнительный заголовок вместе с запросом.

Добавьте метатег на каждую страницу (или основной макет): <meta name="csrf-token" content="{{ csrf_token() }}">

И добавьте в свой javascript файл (или раздел на странице):

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

Смотрите https://laravel.com/docs/master/csrf#csrf-x-csrf-token для более подробной информации.

Ответ 2

90% внутренней ошибки сервера laravel ajax вызвано отсутствием токена CSRF. другие причины могут быть связаны:

  • Неверный тип запроса (например, отправка сообщения для получения)
  • Получен неверный тип данных (например, ajax ожидает JSON, а приложение возвращает строку)
  • Ваш .htaccess неверно настроен
  • Недостающий маршрут
  • Ошибка кода

Подробнее об этом вы можете прочитать здесь: https://abbasharoon.me/how-to-fix-laravel-ajax-500-internal-server-error/

Ответ 3

Я предполагаю, что это было решено к настоящему времени, но все же самое лучшее, что нужно сделать, это отправить токен с вашей формой

{!! csrf_field() !!}

а затем в вашем ajax

$("#try").click(function(){
var url = $(this).attr("data-link");
$.ajax({
    url: "test",
    type:"POST",
    data: { '_token': token, 'someOtherData': someOtherData },
    success:function(data){
        alert(data);
    },error:function(){ 
        alert("error!!!!");
    }
}); //end of ajax
});

Ответ 4

В приложении \Http\Middleware\VerifyCsrfToken.php вы можете попробовать обновить файл примерно так:

class VerifyCsrfToken extends BaseVerifier {

    private $openRoutes =
    [
        ...excluded routes
    ];

    public function handle($request, Closure $next)
    {
        foreach($this->openRoutes as $route)
        {
            if ($request->is($route))
            {
                return $next($request);
            }
        }

        return parent::handle($request, $next);
    }
};

Это позволяет явно обходить определенные маршруты, которые вы не хотите проверять, не отключая проверку csrf глобально.

Ответ 5

Вы можете добавить свои URL-адреса в промежуточное программное обеспечение VerifyCsrfToken.php. URL-адреса будут исключены из проверки CSRF.

protected $except = [
    "your url",
    "your url/abc"
];

Ответ 6

По умолчанию Laravel поставляется с промежуточным программным обеспечением CSRF.

У вас есть 2 варианта:

  • Отправить токен в запросе
  • Отключить промежуточное ПО CSRF (не рекомендуется): в приложении \Http\Kernel.php удалить VerifyCsrfToken из $middleware array

Ответ 7

для меня эта причина ошибки для разных вещей. У меня есть два вызова ajax на моей странице. первый для сохранения комментария, а другой - для сохранения. на моих маршрутах .php у меня было это:

Route::post('posts/show','[email protected]_comment');
Route::post('posts/show','[email protected]_like');

и я получил 500 внутренних ошибок сервера для моего сохранения, как ajax-вызов. поэтому я изменяю тип запроса второй линии http на PUT, и ошибка исчезает. вы также можете использовать PATCH. возможно, это помогает.

Ответ 8

Вместо этого использование post jquery помогло мне решить эту проблему

$.post('url', data, function(response) {
    console.log(response);
});

Ответ 9

вам нужно передать поле csrf через ajax, пожалуйста, посмотрите здесь код

$.ajax({
                                        type: "POST",
                                        url:'{{URL::to("/delete-specialist")}}',
                                        data: {
                                            id: id,

                                            _token: $('#signup-token').val()
                                        },
                                        datatype: 'html',
                                        success: function (response) {
                                            if(response=="deleted"){
                                                $("#"+id).hide();
                                                $("#message").html("successfully deleted");
                                            }

                                        }

                                    });

и вам также нужно написать это поле ввода перед этим

<input id="signup-token" name="_token" type="hidden" value="{{csrf_token()}}">

еще, если вы не понимаете, наслаждайтесь этим видео https://www.youtube.com/watch?v=ykXL8o0slJA&t=20s

Ответ 10

не забудьте добавить "использовать Illuminate\Http\Request;" на вашем контроллере

Ответ 11

  • Краткое и простое решение *

        e.preventDefault();
        var value = $('#id').val();
        var id = $('#some_id').val();
        url="{{url('office/service/requirement/rule_delete/')}}" +"/"+ id;
        console.log(url);
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        $.ajax({
        /* the route pointing to the post function */
            url: url,
            type: 'DELETE',
        /* send the csrf-token and the input to the controller */
            data: {message:value},
            dataType: 'JSON',
        /* remind that 'data' is the response of the AjaxController */
            success: function (data) { 
            console.log(data)
            //$('.writeinfo').append(data.msg);
            //$('#ruleRow'+id).remove();
            }
        });
        return false;