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/0001001010
与 post
路由不匹配,因为它必须是 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