2017-11-18 150 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)對於理解要應用哪個過濾器以及要返回哪個數據子集將是非常重要的。