Laravel 8:POST 请求被视为 GET

Posted

技术标签:

【中文标题】Laravel 8:POST 请求被视为 GET【英文标题】:Laravel 8: POST request is treated as GET 【发布时间】:2021-08-02 00:27:56 【问题描述】:

我有两条接受可选参数的路由:

Route::get('application/cedula/cedula/view?/model?', 'App\Http\Controllers\ApplicationController@getCedulaInformationFromPublicServices')->name('application.cedula');
Route::post('application/cedula/cedula/verification/code?', 'App\Http\Controllers\ApplicationController@verifyApplicationCode')->name('application.confirm');

public function verifyApplicationCode( Request $request, String $cedula, String $code = NULL ) ...
public function getCedulaInformationFromPublicServices( String $cedula, String $view = NULL, String $model = NULL)...

当我向 application/cedula/0001001010/verification 发出 POST 请求时,没有可选参数 "code?",它会进入 GET 路由。

我知道它将 "verification" 作为可选参数 view? 传递给 GET 端点,但 resquest 类型是否足以区分尽管端点名称相似,但要遵循哪一个。

【问题讨论】:

application/cedula/0001001010post 路由不匹配,因为它必须是 application/cedula/0001001010/verification @apokryfos 对不起,端点确实有/verification,我只是在问题中错过了。 不直接支持链接多个可选参数。如果您做了/example,但希望example 成为模型,而不是视图,则代码无法处理。您可以执行/null/example 并将字符串'null' 处理为view,但此时,此参数不是可选的... 两个路由都将匹配application/cedula/0001001010/verification,因此您需要注意可能发生的任何重定向(例如 HTTP 到 HTTPS 重定向或验证失败重定向),因为重定向会将 POST 请求更改为 GET。在浏览器中检查您的开发者控制台,看看是否发生了重定向 【参考方案1】:

“尽管端点名称相似,但 resquest 类型是否足以区分要遵循的类型”?是的,这就够了。问题不在于您的代码。就连我也是这样:

Route::get('application/cedula/cedula/view?/model?', 'App\Http\Controllers\ApplicationController@getCedulaInformationFromPublicServices')->name('application.cedula');
Route::post('application/cedula/cedula/view?/model?', 'App\Http\Controllers\ApplicationController@verifyApplicationCode')->name('application.confirm');

不可能有问题。当存在多个这样的潜在匹配时会出现问题:

Route::post('application/cedula/cedula/view?/model?', ...);
Route::post('application/cedula/cedula/verification/code?', ...);

现在,如果您向application/cedula/0001001010/verification/model1 发出POST 请求,则第一个路由首先出现,因此它将被选中。这是因为当访问一个路由时,Laravel 会从上到下遍历你的路由,直到找到第一个匹配项,此时会立即选择该路由。

但在您的情况下不会有问题,因为您的路线属于不同的请求类型。尝试使用php artisan route:list 检查它们是否被缓存。如果不是,那么问题出在您测试它们的方式上。我会推荐像 Postman 这样的东西。

【讨论】:

【参考方案2】:

尝试重新安排您的路线,将具有恒定路径的路线放在首位

Route::post('application/cedula/cedula/verification/code?', 'App\Http\Controllers\ApplicationController@verifyApplicationCode')->name('application.confirm');
Route::get('application/cedula/cedula/view?/model?', 'App\Http\Controllers\ApplicationController@getCedulaInformationFromPublicServices')->name('application.cedula');

别忘了跑:php artisan route:clear

【讨论】:

以上是关于Laravel 8:POST 请求被视为 GET的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 ​​GET url

为啥来自 Vuejs 的 Laravel 8 的 AJAX POST 请求会引发 405(不支持的方法)错误?

Laravel Cors 中间件不适用于 POST 请求

Angular2 - HTTP 200 被视为错误

laravel 5.8.7 页面过期(419)

laravel post提交数据时显示异常