拥有 API 和网站时如何设置路由

Posted

技术标签:

【中文标题】拥有 API 和网站时如何设置路由【英文标题】:How to setup routes when you have an API and a website 【发布时间】:2021-12-20 08:27:52 【问题描述】:

假设我有一个 Laravel 应用程序,其中有一个页面,可以在表格中显示所有客户。所以在我的web.php 中,我将/customers 指向我的CustomersController 中的index 方法。 index 方法获取所有客户对象并在视图中返回它们和索引刀片。

现在我还想使用api.php 路由构建一个api,我可以在其中获得所有客户的请求。但是,如果我将/customers 指向api.php 路由中的index 方法,它将返回一个视图而不是所有客户对象。这将是无用的。

所以我的问题是处理这个问题的最好方法和最有效的方法是什么。因为仅为 api 请求创建一个“重复的”CustomerController 似乎有点过分了。

【问题讨论】:

在您的控制器中,您可以有条件地返回一个视图,或者,例如,一个 json 响应。即:if ($request->expectsJson()) // ... 。看这里laravel.com/docs/8.x/requests#content-negotiation 这就像一个魅力。如果您可以将其发布为答案,我会接受。 默认情况下,laravel 有 web.php 路由和 api.php 路由,这些路由将被放置在 api/*。使所有路线上的 if 条件很乏味并且违反单一责任原则 但这就是重点。在我的 api.php 文件中,我想指向完全相同的控制器方法。当请求来自网络路由时,它指向 index 方法并返回视图中的所有对象。在 api 路由中,它将指向控制器中的确切方法,但只会返回对象。 【参考方案1】:

可以在索引方法中添加条件

例如:

public function index(Request $request)
 if($request->is("api*")
   return response($customers);
 
 $data['customers'] = $customers;
 return view("customers blade")->with($data);

【讨论】:

我想说,对我来说,这个解决方案比使用 $request->expectsJson() 效果更好。因为我注意到,当使用像 cloudflare 这样的服务时,由于某种原因,ajax 请求中的 Accept 标头被 cloudflare 更改,并且 expectsJson() 不再起作用。由于 Laravel 通过检查 Accept 标头来确定预期结果。

以上是关于拥有 API 和网站时如何设置路由的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 vuejs 路由器中拥有动态路由/组件?

当我拥有客户端 ID 和客户端密码时,如何从使用 OAuth2.0 身份验证的 API 获取数据? (亮稿)

我需要拥有所有 Instagram API 端点 [关闭]

如何使用 React Context API 跨多个 Routes 拥有状态?

我如何拥有单个 Vue 组件以及其中的每个内容如何通过其他组件的按钮进行路由

设置IIS让网站拥有“网站目录外文件”的读写权限的操作(图文)