使用Ajax发布时的MethodNotAllowedHttpException

时间:2018-03-18 15:51:05

标签: javascript php ajax laravel laravel-5.6

我正在尝试做一个Ajax帖子,允许人们通过安装程序中途测试数据库连接,但我不断收到此错误:

Failed to load resource: the server responded with a status of 405 (HTTP/2.0 405)

除了:

{
"message": "",
"exception": "Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException",
"file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php",
"line": 255,
"trace": [
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php",
        "line": 242,
        "function": "methodNotAllowed",
        "class": "Illuminate\\Routing\\RouteCollection",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php",
        "line": 176,
        "function": "getRouteForMethods",
        "class": "Illuminate\\Routing\\RouteCollection",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
        "line": 613,
        "function": "match",
        "class": "Illuminate\\Routing\\RouteCollection",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
        "line": 602,
        "function": "findRoute",
        "class": "Illuminate\\Routing\\Router",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
        "line": 591,
        "function": "dispatchToRoute",
        "class": "Illuminate\\Routing\\Router",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
        "line": 176,
        "function": "dispatch",
        "class": "Illuminate\\Routing\\Router",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
        "line": 30,
        "function": "Illuminate\\Foundation\\Http\\{closure}",
        "class": "Illuminate\\Foundation\\Http\\Kernel",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/fideloper/proxy/src/TrustProxies.php",
        "line": 57,
        "function": "Illuminate\\Routing\\{closure}",
        "class": "Illuminate\\Routing\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
        "line": 149,
        "function": "handle",
        "class": "Fideloper\\Proxy\\TrustProxies",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
        "line": 53,
        "function": "Illuminate\\Pipeline\\{closure}",
        "class": "Illuminate\\Pipeline\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
        "line": 30,
        "function": "Illuminate\\Routing\\{closure}",
        "class": "Illuminate\\Routing\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
        "line": 149,
        "function": "handle",
        "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
        "line": 53,
        "function": "Illuminate\\Pipeline\\{closure}",
        "class": "Illuminate\\Pipeline\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
        "line": 30,
        "function": "Illuminate\\Routing\\{closure}",
        "class": "Illuminate\\Routing\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
        "line": 149,
        "function": "handle",
        "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
        "line": 53,
        "function": "Illuminate\\Pipeline\\{closure}",
        "class": "Illuminate\\Pipeline\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php",
        "line": 27,
        "function": "Illuminate\\Routing\\{closure}",
        "class": "Illuminate\\Routing\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
        "line": 149,
        "function": "handle",
        "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
        "line": 53,
        "function": "Illuminate\\Pipeline\\{closure}",
        "class": "Illuminate\\Pipeline\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php",
        "line": 46,
        "function": "Illuminate\\Routing\\{closure}",
        "class": "Illuminate\\Routing\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
        "line": 149,
        "function": "handle",
        "class": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
        "line": 53,
        "function": "Illuminate\\Pipeline\\{closure}",
        "class": "Illuminate\\Pipeline\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
        "line": 102,
        "function": "Illuminate\\Routing\\{closure}",
        "class": "Illuminate\\Routing\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
        "line": 151,
        "function": "then",
        "class": "Illuminate\\Pipeline\\Pipeline",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
        "line": 116,
        "function": "sendRequestThroughRouter",
        "class": "Illuminate\\Foundation\\Http\\Kernel",
        "type": "->"
    },
    {
        "file": "/home/vagrant/code/public/index.php",
        "line": 55,
        "function": "handle",
        "class": "Illuminate\\Foundation\\Http\\Kernel",
        "type": "->"
    }
]
}

我已经以不同的方式将CSRF令牌添加到Ajax设置中。我通过php artisan route:list检查了我的路线。我使用了$ .ajax和$ .post。我已经更改了我的路由网址,以便它们与任何获取请求都不匹配(因为有时它会从get中返回html)。最后我禁用了CSRF保护,我使用Postman进行了测试,一切正常,因此前端代码出错了。

前端代码:

{!! Form::open(array('route' => 'postInstall', 'class' => 'f1 install', 'method' => 'put')) !!}

                    <h3>ComedyLounge Site Installer</h3>
                    <p>Setup basic requirements for your site</p>
                    <div class="f1-steps">
                        <div class="f1-progress">
                            <div class="f1-progress-line" data-now-value="16.66" data-number-of-steps="4" style="width: 16.66%;"></div>
                        </div>
                        <div class="f1-step active">
                            <div class="f1-step-icon"><i class="fa fa-check"></i></div>
                            <p>Requirements</p>
                        </div>
                        <div class="f1-step">
                            <div class="f1-step-icon"><i class="fa fa-database"></i></div>
                            <p>DB Settings</p>
                        </div>
                        <div class="f1-step">
                            <div class="f1-step-icon"><i class="fa fa-envelope"></i></div>
                            <p>Email Settings</p>
                        </div>
                        <div class="f1-step">
                            <div class="f1-step-icon"><i class="fa fa-thumbs-up"></i></div>
                            <p>Confirm</p>
                        </div>
                    </div>

                    <fieldset>
                        <h4>PHP Version:</h4>
                        @if(version_compare(phpversion(), '7.1.3', '<'))
                            <div class="alert alert-warning">
                                Warning: Requires PHP >= 7.1.3 Your version is {{phpversion()}}
                            </div>
                        @else
                            <div class="alert alert-success">
                                Success: Requires PHP >= 7.1.3 Your version is {{phpversion()}}
                            </div>
                        @endif

                        <h4>Extensions:</h4>
                        <table class="table table-striped">
                            <thead>
                                <tr>
                                    <th></th>
                                    <th>Found</th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($requirements as $requirement => $found)
                                    <tr>
                                        <td>{{$requirement}}</td>
                                        @if($found)
                                            <td><i class="fa fa-check"></i></td>
                                        @else
                                            <td><i class="fa fa-times"></i></td>
                                        @endif
                                    </tr>
                                @endforeach
                            </tbody>
                        </table>
                        <div class="f1-buttons">
                            <button type="button" class="btn btn-next" {!! $canContinue ? '' : 'disabled' !!}>Next</button>
                        </div>
                    </fieldset>

                    <fieldset>
                        <h4>Database Settings:</h4>
                        <div class="form-group">
                            {!! Form::label('database_type', 'Database Type') !!}
                            {!! Form::select('database_type', array('sqlite' => 'SQLite','mysql' => 'MySQL', 'pgsql' => 'Postgres', 'sqlsrv' => 'SQLSrv'), Input::old('database_type'), array('class' => 'form-control database-selector')) !!}
                        </div>
                        <div class="database_group db_sqlite">
                            <div class="form-group">
                                {!! Form::label('database_sqlite_host', 'SQLite Database') !!}
                                {!! Form::text('database_sqlite_host', Input::old('database_sqlite_host'), array('class' => 'form-control', 'placeholder' => 'path/to/sqlite/db')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_sqlite_prefix', 'SQLite Prefix') !!}
                                {!! Form::text('database_sqlite_prefix', Input::old('database_sqlite_prefix'), array('class' => 'form-control', 'placeholder' => 'cl_')) !!}
                            </div>
                        </div>
                        <div class="database_group db_mysql">
                            <div class="form-group">
                                {!! Form::label('database_mysql_host', 'MySQL Host') !!}
                                {!! Form::text('database_mysql_host', Input::old('database_mysql_host'), array('class' => 'form-control', 'placeholder' => '127.0.0.1')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_mysql_port', 'MySQL Port') !!}
                                {!! Form::text('database_mysql_port', Input::old('database_mysql_port'), array('class' => 'form-control', 'placeholder' => '3306')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_mysql_database', 'MySQL Name') !!}
                                {!! Form::text('database_mysql_database', Input::old('database_mysql_database'), array('class' => 'form-control', 'placeholder' => 'ComedyDatabase')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_mysql_username', 'MySQL Username') !!}
                                {!! Form::text('database_mysql_username', Input::old('database_mysql_username'), array('class' => 'form-control', 'placeholder' => 'User')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_mysql_password', 'MySQL Password') !!}
                                {!! Form::text('database_mysql_password', Input::old('database_mysql_password'), array('class' => 'form-control', 'placeholder' => 'Password')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_mysql_prefix', 'MySQL Prefix') !!}
                                {!! Form::text('database_mysql_prefix', Input::old('database_mysql_prefix'), array('class' => 'form-control', 'placeholder' => 'cl_')) !!}
                            </div>
                        </div>
                        <div class="database_group db_pgsql">
                            <div class="form-group">
                                {!! Form::label('database_pgsql_host', 'Postgres Host') !!}
                                {!! Form::text('database_pgsql_host', Input::old('database_pgsql_host'), array('class' => 'form-control', 'placeholder' => '127.0.0.1')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_pgsql_port', 'Postgres Port') !!}
                                {!! Form::text('database_pgsql_port', Input::old('database_pgsql_port'), array('class' => 'form-control', 'placeholder' => '3306')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_pgsql_database', 'Postgres Name') !!}
                                {!! Form::text('database_pgsql_database', Input::old('database_pgsql_database'), array('class' => 'form-control', 'placeholder' => 'ComedyDatabase')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_pgsql_username', 'Postgres Username') !!}
                                {!! Form::text('database_pgsql_username', Input::old('database_pgsql_username'), array('class' => 'form-control', 'placeholder' => 'User')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_pgsql_password', 'Postgres Password') !!}
                                {!! Form::text('database_pgsql_password', Input::old('database_pgsql_password'), array('class' => 'form-control', 'placeholder' => 'Password')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_pgsql_prefix', 'Postgres Prefix') !!}
                                {!! Form::text('database_pgsql_prefix', Input::old('database_pgsql_prefix'), array('class' => 'form-control', 'placeholder' => 'cl_')) !!}
                            </div>
                        </div>
                        <div class="database_group db_sqlsrv">
                            <div class="form-group">
                                {!! Form::label('database_sqlsrv_host', 'SQLSrv Host') !!}
                                {!! Form::text('database_sqlsrv_host', Input::old('database_sqlsrv_host'), array('class' => 'form-control', 'placeholder' => '127.0.0.1')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_sqlsrv_port', 'SQLSrv Port') !!}
                                {!! Form::text('database_sqlsrv_port', Input::old('database_sqlsrv_port'), array('class' => 'form-control', 'placeholder' => '3306')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_sqlsrv_database', 'SQLSrv Name') !!}
                                {!! Form::text('database_sqlsrv_database', Input::old('database_sqlsrv_database'), array('class' => 'form-control', 'placeholder' => 'ComedyDatabase')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_sqlsrv_username', 'SQLSrv Username') !!}
                                {!! Form::text('database_sqlsrv_username', Input::old('database_sqlsrv_username'), array('class' => 'form-control', 'placeholder' => 'User')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_sqlsrv_password', 'SQLSrv Password') !!}
                                {!! Form::text('database_sqlsrv_password', Input::old('database_sqlsrv_password'), array('class' => 'form-control', 'placeholder' => 'Password')) !!}
                            </div>
                            <div class="form-group">
                                {!! Form::label('database_sqlsrv_prefix', 'SQLSrv Prefix') !!}
                                {!! Form::text('database_sqlsrv_prefix', Input::old('database_sqlsrv_prefix'), array('class' => 'form-control', 'placeholder' => 'cl_')) !!}
                            </div>
                        </div>
                        <div class="f1-buttons">
                            <a href="/install?testDB=yezsir" type="button" class="btn btn-left btn-testdb">Test Connection</a>
                            <button type="button" class="btn btn-previous">Previous</button>
                            <button type="button" class="btn btn-next">Next</button>
                        </div>
                    </fieldset>

                    <fieldset>
                        <h4>Set up your account:</h4>
                        <div class="form-group">
                            <label class="sr-only" for="f1-email">Email</label>
                            <input type="text" name="f1-email" placeholder="Email..." class="f1-email form-control" id="f1-email">
                        </div>
                        <div class="form-group">
                            <label class="sr-only" for="f1-password">Password</label>
                            <input type="password" name="f1-password" placeholder="Password..." class="f1-password form-control" id="f1-password">
                        </div>
                        <div class="form-group">
                            <label class="sr-only" for="f1-repeat-password">Repeat password</label>
                            <input type="password" name="f1-repeat-password" placeholder="Repeat password..."
                                   class="f1-repeat-password form-control" id="f1-repeat-password">
                        </div>
                        <div class="f1-buttons">
                            <button type="button" class="btn btn-previous">Previous</button>
                            <button type="button" class="btn btn-next">Next</button>
                        </div>
                    </fieldset>

                    <fieldset>
                        <h4>Social media profiles:</h4>
                        <div class="form-group">
                            <label class="sr-only" for="f1-facebook">Facebook</label>
                            <input type="text" name="f1-facebook" placeholder="Facebook..." class="f1-facebook form-control" id="f1-facebook">
                        </div>
                        <div class="form-group">
                            <label class="sr-only" for="f1-twitter">Twitter</label>
                            <input type="text" name="f1-twitter" placeholder="Twitter..." class="f1-twitter form-control" id="f1-twitter">
                        </div>
                        <div class="form-group">
                            <label class="sr-only" for="f1-google-plus">Google plus</label>
                            <input type="text" name="f1-google-plus" placeholder="Google plus..." class="f1-google-plus form-control" id="f1-google-plus">
                        </div>
                        <div class="f1-buttons">
                            <button type="button" class="btn btn-previous">Previous</button>
                            <button type="submit" class="btn btn-submit">Submit</button>
                        </div>
                    </fieldset>

                {!! Form::close() !!}
<script>
    $(function () {
        $.ajaxSetup({
            headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
        });

        $('.btn-testdb').on('click', function (e) {
            console.log($("form.install").serialize());

            $.get("{{ route("postInstallTestDB") }}", $("form.install").serialize())
                .done(function (data) {
                    alert(data)
                });

            e.preventDefault();

        });
    })
</script>

路线:

Route::get('/install', [
    'as'   => 'getInstall',
    'uses' => 'InstallController@getInstaller',
]);
Route::post('/install', [
    'as'   => 'postInstall',
    'uses' => 'InstallController@postInstaller',
]);
Route::post('/install/testdb', [
    'as'   => 'postInstallTestDB',
    'uses' => 'InstallController@postInstallerTestDB',
]);

我不知道我做错了什么,我检查了每一篇文章,并尝试了几乎所有的东西。 (可能是我想念的小事)

我使用的是最新版本的laravel。

2 个答案:

答案 0 :(得分:0)

来自错误消息的响应代码405表示“不允许的方法”。

在您的前端代码中,您尝试通过put访问路径postInstall,但在您的路线中,postInstall被设置为发布请求。

更改

{!! Form::open(array('route' => 'postInstall', 'class' => 'f1 install', 'method' => 'put')) !!}

{!! Form::open(array('route' => 'postInstall', 'class' => 'f1 install', 'method' => 'post')) !!}

答案 1 :(得分:0)

好的,我发现了问题,它与我的ajax功能有关。我的脚本现在看起来像这样:

<script>
    $.ajaxSetup({
        headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
    });

    $('.btn-testdb').on('click', function (e) {

        $.ajax({
            url: "/install/testdb",
            type: "post",
            method: "post",
            data: $("form.install").serialize(),
            success: function(data) {
                console.log(data);
            },
            error: function (data) {
                console.log("error: " + data);
            },
        });

        e.preventDefault();

    });
</script>

感谢所有帮助过的人。

相关问题