【问题标题】:Laravel API only works on a specific route, others throw a 404 errorLaravel API 仅适用于特定路由,其他会抛出 404 错误
【发布时间】:2020-08-15 08:03:12
【问题描述】:

更新: 运行php artisan route:clear 解决了这个问题,但只是部分解决了。 在我运行命令并成功使用 API 后,我调用的路由再次从路由列表缓存中消失,它迫使我再次运行命令。我不知道为什么会这样。


我正在尝试使用我设置的 Laravel API,但由于某种原因我只能使用三个可用路由之一,另外两个丢弃 404。

Route::post('/login', 'API\UserController@login'); //this works

Route::group(['middleware' => ['auth:api']], function () {
    Route::post('/roles/all', 'API\RoleController@getAll'); //this doesn't work - error 404
    Route::post('/permissions/all', 'API\PermissionController@getAll'); //this doesn't work - error 404
});

路由指向正确的位置,函数存在,并且我通过 Postman 进行的调用具有正确的参数(url 示例:'http://localhost:8000/api/roles/all'、GET 调用、授权字段中的身份验证令牌)。

我将路由放在中间件内部还是外部也没关系(以防它与 oauth2 令牌或中间件本身有问题有关)。

这是我尝试调用的函数之一的示例:

public function getAll()
{
    $role = Role::all();
    return response()->json(['role' => $role], 200);
}

编辑:这是 php artisan route:list 的输出

+--------+----------+----------------------------------------------------------+-----------------------------------+---------------------------------------------------------------------------+------------+
| Domain | Method   | URI                                                      | Name                              | Action
                           | Middleware |
+--------+----------+----------------------------------------------------------+-----------------------------------+---------------------------------------------------------------------------+------------+
|        | POST     | api/login                                                |                                   | App\Http\Controllers\API\UserController@login  
                           | api        |
|        | GET|HEAD | oauth/authorize                                          | passport.authorizations.authorize | Laravel\Passport\Http\Controllers\AuthorizationController@authorize       | web,auth   |
|        | DELETE   | oauth/authorize                                          | passport.authorizations.deny      | Laravel\Passport\Http\Controllers\DenyAuthorizationController@deny        | web,auth   |
|        | POST     | oauth/authorize                                          | passport.authorizations.approve   | Laravel\Passport\Http\Controllers\ApproveAuthorizationController@approve  | web,auth   |
|        | POST     | oauth/clients                                            | passport.clients.store            | Laravel\Passport\Http\Controllers\ClientController@store                  | web,auth   |
|        | GET|HEAD | oauth/clients                                            | passport.clients.index            | Laravel\Passport\Http\Controllers\ClientController@forUser                | web,auth   |
|        | PUT      | oauth/clients/{client_id}                                | passport.clients.update           | Laravel\Passport\Http\Controllers\ClientController@update                 | web,auth   |
|        | DELETE   | oauth/clients/{client_id}                                | passport.clients.destroy          | Laravel\Passport\Http\Controllers\ClientController@destroy                | web,auth   |
|        | POST     | oauth/personal-access-tokens                             | passport.personal.tokens.store    | Laravel\Passport\Http\Controllers\PersonalAccessTokenController@store     | web,auth   |
|        | GET|HEAD | oauth/personal-access-tokens                             | passport.personal.tokens.index    | Laravel\Passport\Http\Controllers\PersonalAccessTokenController@forUser   | web,auth   |
|        | DELETE   | oauth/personal-access-tokens/{token_id}                  | passport.personal.tokens.destroy  | Laravel\Passport\Http\Controllers\PersonalAccessTokenController@destroy   | web,auth   |
|        | GET|HEAD | oauth/scopes                                             | passport.scopes.index             | Laravel\Passport\Http\Controllers\ScopeController@all                     | web,auth   |
|        | POST     | oauth/token                                              | passport.token                    | Laravel\Passport\Http\Controllers\AccessTokenController@issueToken        | throttle   |
|        | POST     | oauth/token/refresh                                      | passport.token.refresh            | Laravel\Passport\Http\Controllers\TransientTokenController@refresh        | web,auth   |
|        | GET|HEAD | oauth/tokens                                             | passport.tokens.index             | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth   |
|        | DELETE   | oauth/tokens/{token_id}                                  | passport.tokens.destroy           | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth   |
|        | POST     | telescope/telescope-api/cache                            |                                   | Laravel\Telescope\Http\Controllers\CacheController@index                  | telescope  |
|        | GET|HEAD | telescope/telescope-api/cache/{telescopeEntryId}         |                                   | Laravel\Telescope\Http\Controllers\CacheController@show                   | telescope  |
|        | POST     | telescope/telescope-api/commands                         |                                   | Laravel\Telescope\Http\Controllers\CommandsController@index               | telescope  |
|        | GET|HEAD | telescope/telescope-api/commands/{telescopeEntryId}      |                                   | Laravel\Telescope\Http\Controllers\CommandsController@show                | telescope  |
|        | POST     | telescope/telescope-api/dumps                            |                                   | Laravel\Telescope\Http\Controllers\DumpController@index                   | telescope  |
|        | POST     | telescope/telescope-api/events                           |                                   | Laravel\Telescope\Http\Controllers\EventsController@index                 | telescope  |
|        | GET|HEAD | telescope/telescope-api/events/{telescopeEntryId}        |                                   | Laravel\Telescope\Http\Controllers\EventsController@show                  | telescope  |
|        | POST     | telescope/telescope-api/exceptions                       |                                   | Laravel\Telescope\Http\Controllers\ExceptionController@index              | telescope  |
|        | PUT      | telescope/telescope-api/exceptions/{telescopeEntryId}    |                                   | Laravel\Telescope\Http\Controllers\ExceptionController@update             | telescope  |
|        | GET|HEAD | telescope/telescope-api/exceptions/{telescopeEntryId}    |                                   | Laravel\Telescope\Http\Controllers\ExceptionController@show               | telescope  |
|        | POST     | telescope/telescope-api/gates                            |                                   | Laravel\Telescope\Http\Controllers\GatesController@index                  | telescope  |
|        | GET|HEAD | telescope/telescope-api/gates/{telescopeEntryId}         |                                   | Laravel\Telescope\Http\Controllers\GatesController@show                   | telescope  |
|        | POST     | telescope/telescope-api/jobs                             |                                   | Laravel\Telescope\Http\Controllers\QueueController@index                  | telescope  |
|        | GET|HEAD | telescope/telescope-api/jobs/{telescopeEntryId}          |                                   | Laravel\Telescope\Http\Controllers\QueueController@show                   | telescope  |
|        | POST     | telescope/telescope-api/logs                             |                                   | Laravel\Telescope\Http\Controllers\LogController@index                    | telescope  |
|        | GET|HEAD | telescope/telescope-api/logs/{telescopeEntryId}          |                                   | Laravel\Telescope\Http\Controllers\LogController@show                     | telescope  |
|        | POST     | telescope/telescope-api/mail                             |                                   | Laravel\Telescope\Http\Controllers\MailController@index                   | telescope  |
|        | GET|HEAD | telescope/telescope-api/mail/{telescopeEntryId}          |                                   | Laravel\Telescope\Http\Controllers\MailController@show                    | telescope  |
|        | GET|HEAD | telescope/telescope-api/mail/{telescopeEntryId}/download |                                   | Laravel\Telescope\Http\Controllers\MailEmlController@show                 | telescope  |
|        | GET|HEAD | telescope/telescope-api/mail/{telescopeEntryId}/preview  |                                   | Laravel\Telescope\Http\Controllers\MailHtmlController@show                | telescope  |
|        | POST     | telescope/telescope-api/models                           |                                   | Laravel\Telescope\Http\Controllers\ModelsController@index                 | telescope  |
|        | GET|HEAD | telescope/telescope-api/models/{telescopeEntryId}        |                                   | Laravel\Telescope\Http\Controllers\ModelsController@show                  | telescope  |
|        | POST     | telescope/telescope-api/monitored-tags                   |                                   | Laravel\Telescope\Http\Controllers\MonitoredTagController@store           | telescope  |
|        | GET|HEAD | telescope/telescope-api/monitored-tags                   |                                   | Laravel\Telescope\Http\Controllers\MonitoredTagController@index           | telescope  |
|        | POST     | telescope/telescope-api/monitored-tags/delete            |                                   | Laravel\Telescope\Http\Controllers\MonitoredTagController@destroy         | telescope  |
|        | POST     | telescope/telescope-api/notifications                    |                                   | Laravel\Telescope\Http\Controllers\NotificationsController@index          | telescope  |
|        | GET|HEAD | telescope/telescope-api/notifications/{telescopeEntryId} |                                   | Laravel\Telescope\Http\Controllers\NotificationsController@show           | telescope  |
|        | POST     | telescope/telescope-api/queries                          |                                   | Laravel\Telescope\Http\Controllers\QueriesController@index                | telescope  |
|        | GET|HEAD | telescope/telescope-api/queries/{telescopeEntryId}       |                                   | Laravel\Telescope\Http\Controllers\QueriesController@show                 | telescope  |
|        | POST     | telescope/telescope-api/redis                            |                                   | Laravel\Telescope\Http\Controllers\RedisController@index                  | telescope  |
|        | GET|HEAD | telescope/telescope-api/redis/{telescopeEntryId}         |                                   | Laravel\Telescope\Http\Controllers\RedisController@show                   | telescope  |
|        | POST     | telescope/telescope-api/requests                         |                                   | Laravel\Telescope\Http\Controllers\RequestsController@index               | telescope  |
|        | GET|HEAD | telescope/telescope-api/requests/{telescopeEntryId}      |                                   | Laravel\Telescope\Http\Controllers\RequestsController@show                | telescope  |
|        | POST     | telescope/telescope-api/schedule                         |                                   | Laravel\Telescope\Http\Controllers\ScheduleController@index               | telescope  |
|        | GET|HEAD | telescope/telescope-api/schedule/{telescopeEntryId}      |                                   | Laravel\Telescope\Http\Controllers\ScheduleController@show                | telescope  |
|        | POST     | telescope/telescope-api/toggle-recording                 |                                   | Laravel\Telescope\Http\Controllers\RecordingController@toggle             | telescope  |
|        | POST     | telescope/telescope-api/views                            |                                   | Laravel\Telescope\Http\Controllers\ViewsController@index                  | telescope  |
|        | GET|HEAD | telescope/telescope-api/views/{telescopeEntryId}         |                                   | Laravel\Telescope\Http\Controllers\ViewsController@show                   | telescope  |
|        | GET|HEAD | telescope/{view?}                                        | telescope                         | Laravel\Telescope\Http\Controllers\HomeController@index                   | telescope  |
+--------+----------+----------------------------------------------------------+-----------------------------------+---------------------------------------------------------------------------+------------+

【问题讨论】:

  • 在终端运行php artisan route:list,查看可用路线列表
  • 你能用命令的输出更新你的问题吗:php artisan route:list
  • 完成,当登录出现时,输出中似乎缺少两条路由。
  • 那你明白为什么它会返回 404。所有路由都在同一个路由文件中吗?另外,如果出现丢失的路由,请执行php artisan route:clear 并再次运行 list 命令
  • php artisan route:clear 成功了,它们现在出现在路线列表中,我可以使用它们!您能否将此作为答案发布,以便我进行验证?

标签: laravel api


【解决方案1】:

新路由丢失可能是因为 Laravel 正在为缓存的路由提供服务。验证这一点的一种快速方法是运行php artisan route:list

如果路线不存在,则证实了该理论。解决方案是运行 php artisan route:clear 告诉 laravel 清除路由缓存,以便可以从路由文件中重新获取路由。

之后,再次运行php artisan route:list。丢失的路线现在应该会显示出来并且可以访问。

【讨论】:

  • 好的,这可以解决问题,但发生了一些奇怪的事情。在使用 API 后,它从 route:list 中消失,我必须再次清除它才能显示并再次使用它,然后循环重复。为什么会这样?
  • 这很奇怪。请问你用的是什么版本的laravel?我怀疑 laravel 望远镜包
  • 除了缓存问题之外,最好将标头中的令牌作为授权密钥传递。
  • 我使用的是 Laravel 6.13.1 版,是的,我在授权字段中传递了令牌。 OP上写错了,谢谢指出。
  • 我不确定可能是什么问题。运行,php artisan route:clear,然后是php artisan route:cache。现在,如果两次都能正常工作,请尝试使用两次 API
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2014-06-22
  • 2019-10-30
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多