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 的基础。
我正在使用关系 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 的基础。