REST API网址及其在路由器和控制器之间的分配

时间:2017-11-18 12:06:14

标签: node.js rest api express restful-url

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

  • 用户
  • 位置
  • 作物

使用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的角度来看关于端点网址。

目前他们是:

主机名/ api / user /:id - 用户帐户

主机名/ api / user /:id / locations - 用户位置

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

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

这个网址结构从休息角度看是否正常?

在API收到请求之后,我无法将我的头部包裹起来......路由器和控制器应该负责我的路由,例如:

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

是否应该从用户路由器和控制器处理此URL? 或者从路由器和控制器的位置?

网址清楚地说:"对于用户:id,找到我的位置:locationid属于他。"。因此,我作为没有经验的开发人员会自动假设此路由应位于用户路由器中:

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

但是这样,我想我会使用包含所有可能网址的用户路由器:

/user
/user/:id
/user/:id/locations
...
...
/user/:id/crops
/user/:id/crops/:cropid
...

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

目前以/ user ....开头的每个路由都由我的User Express路由器处理,然后传递给上面示例url中的UserController.getUserLocationById。

但我认为我这样犯了错误。

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

最好的问候

1 个答案:

答案 0 :(得分:1)

您的路由对我来说很清楚,并且符合REST。 阅读伪网址,对我来说,可以理解你将使用它们的结果。

我对实际实现的看法是每个路由器应该负责根据第一个令牌(用户,位置,裁剪......)来处理路由,并且应该基于您将要返回的数据。

对我来说,你可以这样做:

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

路由,将负责处理传入请求的路由器。 数据,将由Controller负责提供数据,进行验证等。

这样做无论您使用哪个网址到达那里,每个控制器都只负责提供其所有者的数据。 当然,路由(URL)将是理解要应用哪个过滤器以及返回哪个数据子集的基础。