【问题标题】:Ajax post request in laravel 5 return error 500 (Internal Server Error)laravel 5 中的 Ajax 发布请求返回错误 500(内部服务器错误)
【发布时间】:2015-07-21 04:18:22
【问题描述】:

这是我在 laravel 5 中的测试 ajax(参考下文)

$("#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';
});

但是当我在谷歌浏览器中运行控制台时它给了我一个错误并且它没有返回预期的响应“return 'Success! ajax in laravel 5';”

POST http://juliver.laravel.com/test 500(内部服务器错误)

我的代码有什么问题/问题?我有什么遗漏吗?

【问题讨论】:

    标签: php jquery ajax laravel laravel-5


    【解决方案1】:

    虽然这个问题存在一段时间,但没有给出可接受的答案,但我想向您指出解决方案。因为您使用 ajax 发送,并且可能仍然使用 CSRF 中间件,所以您需要在请求中提供额外的标头。

    为每个页面(或主布局)添加元标记:&lt;meta name="csrf-token" content="{{ csrf_token() }}"&gt;

    并添加到您的 javascript 文件(或页面内的部分):

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

    更多详情请见https://laravel.com/docs/master/csrf#csrf-x-csrf-token

    【讨论】:

    • 我从 laravel 禁用了 CSRF,但得到 500 错误。我可以知道为什么吗?
    • 另外,请仔细检查您的路线。如果路由有错别字,也会报500错误
    【解决方案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
      });
      

      【讨论】:

      • 我从 laravel 内核禁用了 CSRF,但是在 ajax 调用时出现 500 错误,请问我知道为什么吗?
      • 签入位于 storage/logs 文件夹中的 laravel.log 文件
      • 检查日志文件意味着通过它并找出导致错误的原因。 @151291
      【解决方案4】:

      您可以将 URL 添加到 VerifyCsrfToken.php 中间件。这些 URL 将被排除在 CSRF 验证之外。

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

      【讨论】:

        【解决方案5】:

        在 App\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 验证的情况下显式绕过您不想验证的特定路由。

        【讨论】:

          【解决方案6】:

          Laravel 7.X 在bootstrap.js中,在axios相关代码中,添加:

          window.axios.defaults.headers.common['X-CSRF-TOKEN'] = $('meta[name="csrf-token"]').attr('content');
          

          解决了很多无法解释的 500 ajax 错误。 当然是给用axios的人用的

          【讨论】:

            【解决方案7】:

            Laravel 默认自带 CSRF 中间件。

            你有两个选择:

            1. 在您的请求中发送令牌
            2. 禁用 CSRF 中间件(不推荐):在 app\Http\Kernel.php 中从 $middleware 数组中删除 VerifyCsrfToken

            【讨论】:

              【解决方案8】:

              对我来说,这个错误是由不同的东西引起的。 我的页面中有两个 ajax 调用。 第一个用于保存评论,另一个用于保存喜欢。 在我的 routes.php 中我有这个:

              Route::post('posts/show','PostController@save_comment');
              Route::post('posts/show','PostController@save_like');
              

              我的保存如 ajax 调用时出现 500 个内部服务器错误。 所以我将第二行 http 请求类型更改为 PUT 并且错误消失了。 您也可以使用 PATCH。 也许有帮助。

              【讨论】:

                【解决方案9】:

                你必须通过ajax传递csrf字段请看这里的代码

                $.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

                【讨论】:

                • 不鼓励仅使用代码的答案,因为它们没有说明如何解决问题。请更新您的答案,以解释这如何改进该问题已有的其他已接受和赞成的答案。请参阅:How do I write a good answer
                【解决方案10】:

                短而简单的解决方案

                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;
                

                【讨论】:

                  【解决方案11】:

                  使用 post jquery 代替帮助我解决了这个问题

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

                  【讨论】:

                    【解决方案12】:

                    不要忘记添加“使用 Illuminate\Http\Request;”在你的控制器上

                    【讨论】:

                      【解决方案13】:

                      我有同样的问题。就我而言,出现问题是因为我的表(在数据库中)的 id 字段未设置为自动递增。当我将它设置为自动递增时,它就开始工作了。

                      【讨论】:

                        猜你喜欢
                        • 2018-01-24
                        • 2021-01-14
                        • 2019-05-24
                        • 2019-06-05
                        • 2016-06-11
                        • 1970-01-01
                        • 2016-09-16
                        • 2019-11-12
                        • 2015-09-20
                        相关资源
                        最近更新 更多