REST API url 及其在路由器和控制器之间的分布

REST API urls and their distribution among routers and controllers

我正在使用关系 mysql 数据库开发一个项目。我的表是:

使用Node/Express

简化代码结构:

/routers
/routers/User.js
/routers/Location.js
/routers/Crop.js
/controlers
/controlers/UserController.js
/controlers/LocationController.js
/controlers/CropController.js
/models
/models/UserModel.js
/models/LocationModel.js
/models/CropModel.js
app.js

关系是用户可以有很多地点(农场),在一个地点可以种植很多作物。

数据库关系的事情已经完成,没问题。我的问题是关于如何在逻辑上构建我的代码,同时保持 REST 原则的完整性!

我从 API 的角度想知道端点 urls。

目前他们是:

hostname/api/user/:id - 用户帐号

hostname/api/user/:id/locations - 用户位置

hostname/api/user/:id/locations/:locationid - 关于属于特定用户的特定位置的信息

hostname/api/user/:id/locations/:locationid/crops - 列出所有种植在特定位置、属于特定用户的作物

从休息的角度来看,这个url结构可以吗?

在 API 中收到请求后,我无法绕过...哪个路由器和控制器应该负责我的路线,例如:

hostname/api/user/:id/locations/:locationid

这个 url 应该从用户路由器和控制器处理吗? 或者从位置路由器和控制器?

url 明确表示: "For user with :id, find me location with :locationid which belongs to him."。所以,作为一个没有经验的开发者,我自动假设这条路由应该在用户路由器内:

UserRouter.get(/:id/locations/:locationid, function(....){
    UserController.getUserLocationById(:id, :locationid);
})
app.use('/user', UserRouter)

但是这样,我想我会得到包含所有可能的 urls:

的用户路由器
/user
/user/:id
/user/:id/locations
...
...
/user/:id/crops
/user/:id/crops/:cropid
...

其他路由器和控制器没有。而我这个事实只是让我觉得我对 REST API 代码结构的想法是错误的。

目前,每条以 /user.... 开头的路由都由我的 User Express 路由器处理,然后在上面的示例 url.

中传递给 UserController.getUserLocationById

但我认为我这样做是错误的。

如果有人理解我的撞头,能帮我解决一下吗?

此致

你的路由在我看来很清晰并且符合 REST。 阅读伪 urls,对我来说,使用它们会得到什么结果是可以理解的。

我对实际实现的看法是,每个路由器应该负责处理基于第一个令牌(用户、位置、作物...)的路由,并且到负责的控制器的内部映射应该基于在您即将 return.

的数据上

对我来说,你可以按照这个:

URL: hostname/api/user/:id
ROUTE: user
DATA: user

URL: hostname/api/user/:id/locations
ROUTE: user
DATA: location

URL: hostname/api/user/:id/locations/:locationid
ROUTE: user
DATA: location

URL: hostname/api/user/:id/locations/:locationid/crops 
ROUTE: user
DATA: crop

URL: hostname/api/locations/:locationid
ROUTE: location
DATA: location

URL: hostname/api/locations/:locationid/crops 
ROUTE: location
DATA: crop

URL: hostname/api/crops/:cropid/locations 
ROUTE: crop
DATA: location

Route,将是负责处理传入请求的路由器。 数据,会由Controller负责提供数据,做校验等。

这样一来,无论您使用哪个 url 到达那里,每个控制器都将只负责为它所拥有的数据提供服务。 当然,路由 (URL) 将是了解要应用哪个过滤器以及将哪个数据子集应用到 return 的基础。