Laravel 405方法不允许AJAX请求

时间:2018-10-20 17:38:47

标签: javascript ajax laravel laravel-5

该代码在我的本地开发环境中工作正常,但是当我将其上传到服务器时却给出了405 method not allowed异常。 this问题和this问题的解决方案对我不起作用。

这是控制器。

    public function DeleteMultipleProjects(Request $request){
        $json = $request->projectsToDelete;
        $to_delete = collect([]);

        $projects = json_decode($json);
        foreach ($projects as $project) {
            $to_delete->push($project->id);
        }

        Project::destroy($to_delete);
    }

这是路由文件中的相应条目。

Route::post('/ajax/dashboard/delete-projects', 'ProjectController@DeleteMultipleProjects');

这是URL的AJAX调用。

    $.ajax({
        url: '/ajax/dashboard/delete-projects',
        method: 'POST',
        data: {
            projectsToDelete: JSON.stringify(vThis.selectedProjects),
        },
        complete: function(){
            vThis.refreshProjects();
        }
    });

这是示例测试用例的数据。

[{"id":140,"name":"a","updated_at":"Sun, Oct 21, 2018 4:31 AM","selected":true,"selectHovering":false},{"id":139,"name":"New Project","updated_at":"Sun, Oct 21, 2018 4:31 AM","selected":true,"selectHovering":false}]

如何克服这个错误,为什么这只会在生产中发生?

编辑值得注意的是,我还有其他AJAX调用可以遍及整个应用程序,并且它们工作正常。

3 个答案:

答案 0 :(得分:0)

似乎您缺少csrf令牌

将您的ajax发布数据更新为:

$.ajax({
    url: '/ajax/dashboard/delete-projects',
    method: 'POST',
    data: {
        projectsToDelete: JSON.stringify(vThis.selectedProjects),
        _token: '{{ csrf_token() }}',
    },
    complete: function(){
        vThis.refreshProjects();
    }
});

答案 1 :(得分:0)

Laravel中的405错误表示您使用的HTTP方法不存在该路由。

如果您在生产中收到此错误,但在本地未收到此错误,则表明您的路由文件已过时或已被缓存。

使用以下方法清除路由缓存:

php artisan route:clear

验证您的POST路由是否存在:

php artisan route:list --path=ajax/dashboard/delete-projects

如果route:list确认您的POST路由存在,但您仍收到405,则可能导致缓存路由的另一件事是opcache,而没有重新验证时间戳,您可能需要重新启动php进程才能清除。 / p>

答案 2 :(得分:0)

问题出在我发送的数据中。我不确定为什么,但是我的服务器不喜欢整个项目数组,因此我将其更新为仅发送我要删除的id数组,因此将控制器更新为destroy请求。如果有人有解释,我很好奇。