【问题标题】:REST API urls and their distribution among routers and controllersREST API url 及其在路由器和控制器之间的分布
【发布时间】:2017-11-18 12:06:14
【问题描述】:

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

  • 用户
  • 位置
  • 作物

使用节点/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 的角度想知道端点 url。

目前他们是:

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

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

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

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

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

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

主机名/api/user/:id/locations/:locationid

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

网址清楚地写着:“对于具有 :id 的用户,使用属于他的 :locationid 找到我的位置。”。所以,我作为没有经验的开发者会自动假设这条路由应该在用户路由器内部:

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

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

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

在其他路由器和控制器中没有任何内容。而我这个事实只是让我认为我对 REST API 代码结构的想法是错误的。

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

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

如果有人理解我的头撞,你能帮我解决这个问题吗?

最好的问候

【问题讨论】:

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


    【解决方案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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多