【发布时间】: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