拥有 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 和网站时如何设置路由的主要内容,如果未能解决你的问题,请参考以下文章
当我拥有客户端 ID 和客户端密码时,如何从使用 OAuth2.0 身份验证的 API 获取数据? (亮稿)
如何使用 React Context API 跨多个 Routes 拥有状态?