Laravel API路由未找到。

17

我是 API 和 Vue 的新手。我正在使用 Laravel 5.8 的 api.php、控制器和视图,但只返回 404 Not Found。

这是我尝试过的:

api.php

 Route::group(['middleware' => 'api'], function(){
    Route::resource('/dashboard/departments', 'DepartmentsController');
 });

控制器

class DepartmentsController extends Controller
{     
   public function index()
  {
  return 'hey';
  }
}
路由列表
 GET|HEAD  | api/dashboard/departments                   | departments.index   | App\Http\Controllers\DepartmentsController@index                       | api,auth  

我尝试访问/127.0.0.1:8000/api/dashboard/departments/127.0.0.1:8000/dashboard/departments,但两者都无法工作。


Route::resource 只能有一条路由吗? - keyboardSmasher
2
请执行以下命令(php artisan route:clear) 然后再次启动服务器(php artisan serve) - Igor Carvalho
还有更多的路由,我只展示了索引,而且我已经运行了路由清除命令。 - jeesoon
根页面是否显示?127.0.0.1:8000/ - keyboardSmasher
是的,根节点显示。 - jeesoon
7个回答

36

请记住,api.php 中声明的路由将自动添加 /api 前缀,例如:

Route::get('/hello', ...)
axios.get('/api/hello')

1
预设的URL也经过测试,因此我认为这不是解决此问题的方法。 - Henridv
问题就在那里。"我尝试通过/127.0.0.1:8000/api/dashboard/departments访问它"。 - miken32

7

您的API路由位于需要API类型身份验证的api中间件中。如果您查看API身份验证文档,您需要设置和传递API令牌。

您需要使用请求传递令牌,删除api中间件并使您的API路由处于未经身份验证状态,或将需要通过浏览器访问的路由移出api中间件并放入web中间件和路由文件中。


1
你说得对。为了简单测试验证我的API是否正常工作,即在不实现任何身份验证的情况下,我遵循你的建议:我只需删除某些API路由的api中间件,使它们成为未经身份验证的状态。因此,我可以通过以下URL访问API:http://localhost/mylaravelprojects/myjwtapp/public/api/user。这是有效的。当然,在实际项目中,我需要使用Passport或简单的JWT来实现身份验证。 - Lex Soft
1
很好的解释。 - Richard

5

只需在 api 的 url 前面添加 public。

例如:

/127.0.0.1:8000/public/api/dashboard/departments

@jeesoon请展示你正在尝试的完整URL。 - Muhammad Shareyar
我尝试了这个建议 /127.0.0.1:8000/public/api/dashboard/departments 和另外两个 /127.0.0.1:8000/api/dashboard/departments 和 /127.0.0.1:8000/dashboard/departments。 - jeesoon
在api之前添加public关键字,像这样的url---->/127.0.0.1:8000/public/api/dashboard/departments - Paras Raiyani
他为什么要那样做呢?代码中没有指定任何“public”前缀。 - Nicolas
1
除非您的Web服务器配置错误,否则Laravel默认情况下不包含此功能。 - miken32
显示剩余2条评论

4

直接运行

php artisan route:clear

谢谢,它有效果了,有关为什么我们需要“清除”才能使其生效的任何相关内容? - undefined

4

如果你还在疑惑,或者只有我一个人这样。 经过多次尝试,这是我做的。

我从我的API.php中删除了route::group,并从RouteServiceProvider.php中删除了prefix('api'),并用middleware('web')替换它。

这是我的RouteServiceProvider.php文件。

protected function mapApiRoutes()
{
    Route::middleware('api')
        ->middleware('web')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}

这是我的api.php文件。 Route::resource('/dashboard/departments', 'DepartmentsController'); 这行代码定义了一个路由,用于管理部门相关信息。

2
不妨尝试以下方法?不要更改RouteServiceProvider的内容,这样你的路由仍然会有API前缀,以防其他API路由需要身份验证。只需更改api.php文件,使其像你所提到的那样,这样你的某些路由,如/dashboard/departments,就不需要进行身份验证。然后,您可以使用此URL访问API:127.0.0.1:8000/public/api/dashboard/departments。它应该像我的一样工作。但如果不行,您可以恢复到上述解决方案。 - Lex Soft
1
这是什么意思?如果你不想要 API 前缀,只需将路由放在 web.php 中即可。 - miken32

3
如果你正在使用REST客户端(如Imsomnia、Postman),你需要检查是否接受JSON响应。在请求中添加一个名为“Accept”的头,值为“application/json”。 带“application/json”值的“Accept”头 如果请求的路由有验证(并且你没有发送该头信息),你将会得到根页面作为响应(或者如果你在routes/web.php中没有该路由,则会收到404错误)。

1
更改接受标头不会影响您是否收到404错误。 - miken32
这对我有用,尽管问题不是404。问题在于对API端点的请求被重定向到根端点。 - Osinachi

0

运行 Laravel 项目 "将主机替换为您自己的":

php artisan serve --host 10.11.222.33 --port 8000

或者也可以这样做

php artisan serve --host 127.0.0.1 --port 8000

然后调用 API。

http://10.11.222.33:8000/api/departments


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接