2017-11-18 130 views
0

我正在使用关系型MySQL DB进行项目工作。我的表是:REST API网址及其在路由器和控制器之间的分布

  • 用户
  • 位置
  • 作物

使用节点/快递

简化代码结构:

/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 /用户/:ID - 用户帐户

主机名/ API /用户/:ID /位置 - 用户位置

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

主机名/ API /用户/:ID /位置/:locationid /作物 - 列表,它种植在指定位置的所有作物,属于特定用户

这是URL结构从静止的角度好不好?

主机名/ API /用户/:ID /位置

而且之后请求API我不能换我的头......以防万一哪个路由器和控制器应负责我的路线,前被接收/: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 ....开头的每条路由都由我的用户快速路由器处理,然后传递给上面示例url中的UserController.getUserLocationById。

但我想我这样做是一个错误。

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

最好的问候

回答

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 

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

这样做,每个控制器将只负责提供它是业主的数据,无论您使用哪个网址到达那里。 当然,路由(URL)对于理解要应用哪个过滤器以及要返回哪个数据子集将是非常重要的。