laravel 5中的ajax发布返回错误500(内部服务器错误)

时间:2015-05-10 17:34:25

标签: php jquery ajax laravel laravel-5

这是我在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';
});

但是当我在谷歌浏览器中运行控制台并且它没有返回预期的响应时它会给我错误#34;返回&#39;成功!在laravel 5&#39;;&#34;

中的ajax
  

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

我的代码有什么问题/问题?什么我失踪了?

12 个答案:

答案 0 :(得分:45)

虽然这个问题存在了一段时间,但没有给出接受的答案,我想指出你的解决方案。由于您使用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

答案 1 :(得分:9)

laravel ajax内部服务器错误的90%是由于缺少CSRF令牌。其他原因可以包括:

  • 错误的请求类型(例如发送帖子以获取)
  • 收到错误的数据类型(例如ajax期待JSON和app返回字符串)
  • 您的.htaccess配置错误
  • 缺少路线
  • 代码错误

您可以在此处详细了解详情:https://abbasharoon.me/how-to-fix-laravel-ajax-500-internal-server-error/

答案 2 :(得分:7)

我想这已经解决了,但是这里最好的办法就是发送带有你表单的令牌

{!! 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
});

答案 3 :(得分:3)

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

答案 4 :(得分:3)

您可以将您的网址添加到VerifyCsrfToken.php中间件。这些网址将从CSRF验证中排除。

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

答案 5 :(得分:1)

默认情况下,Laravel附带CSRF中间件。

您有两个选择:

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

答案 6 :(得分:1)

对我来说这个错误导致了不同的东西。 我的页面中有两个ajax调用。 第一个用于保存注释,另一个用于保存。 在我的routes.php中我有这个:

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

我得到500内部服务器错误,我的保存像ajax调用。 所以我将第二行http请求类型更改为PUT,错误消失。 你也可以使用PATCH。 也许有帮助。

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

你必须通过ajax传递csrf字段,请查看此处的代码

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

并且您还需要在此

之前编写此输入字段
ggplot(data=melt(data_go)) + stat_count(mapping = aes(x=value, y=..prop.., group=1), width=.2)+
  facet_wrap(~variable, scales = 'free_x')+
  scale_y_continuous(labels = scales::percent)

如果您不明白,请欣赏此视频 https://www.youtube.com/watch?v=ykXL8o0slJA&t=20s

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:0)

  • 简易解决方案*

        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 :(得分:0)

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