【问题标题】:MethodNotAllowedHttpException when using Ajax to post使用 Ajax 发帖时出现 MethodNotAllowedHttpException
【发布时间】:2018-08-27 05:46:10
【问题描述】:

我正在尝试做一个 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": "->"
    }
]
}

我以 3 种不同的方式将 CSRF 令牌添加到 Ajax 设置中。我已经通过 php artisan route:list 检查了我的路线。我同时使用了 $.ajax 和 $.post。我已经更改了我的路由 url,以便它们与任何 get 请求都不匹配(因为有时它会从 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。

【问题讨论】:

  • 要补充的是,当我同时使用 $.post() 和 $.ajax 并将类型和方法设置为 post 时,JQuery 作为 Get 而不是 Post 发送。解决这个问题的唯一方法是当我为 $.ajax 设置 contentType 但我无法在后端读取它,就好像它是一个表单一样。
  • 您使用了哪种内容类型。你试过'multipart/form-data'吗?
  • 我尝试将 json 作为内容类型,这有点工作,但我无法访问数据。我会试试你列出的 2 个。
  • 好的,我尝试了“multipart/form-data”,结果与使用 json 作为内容类型时所做的完全相同。

标签: javascript php ajax laravel laravel-5.6


【解决方案1】:

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

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

改变

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

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

【讨论】:

  • 感谢您修复了我的表单,但并没有改变我的 Ajax 无法正常工作的任何内容。
【解决方案2】:

好的,我发现了问题,它与我的 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>

感谢所有提供帮助的人。

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2018-10-22
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多