嵌套REST资源的Angular ui-router状态名称

时间:2016-11-30 09:41:11

标签: angularjs spring rest http

我目前正在设计新API和使用API​​的网络应用程序。

例如,假设我有以下REST资源:(使用spring-boot微服务):

GET    /orders            // get all orders
POST   /orders            // create an order 
GET    /orders/1          // get order with id 1
PUT    /orders/1          // update order with id 1

GET    /orders/1/items    // get all order items
POST   /orders/1/items    // create an order item
GET    /orders/1/items/2  // get the order item with id 2 of order with id 1
PUT    /orders/1/items/2  // update order item with id 2 of order with id 1

我认为,这是一种非常常见的用法。在我的应用程序中,资源更加嵌套。

我在ui-router中使用angular,我想为REST-API尽可能地关闭相应表单/视图定义状态/ URL。由于无法对GET,POST,PUT使用相同的URL,因此我想知道定义这些状态的标准(最佳实践)是什么。

几乎所有文本,教程等都使用以下URL /状态作为CRUD方法:

/#/orders/              // state: orders
/#/orders/create        // state: orders.create
/#/orders/1/show        // state: orders.show
/#/orders/1/edit        // state: orders.edit

这是相当直接的。 但没有人讨论如何设计嵌套资源。因此,如何处理嵌套项资源会很有趣吗?

通常,我希望有一个带控制器的嵌套视图来显示项目,以便这些项目是orders.show状态的子状态。

因此,如果我使用书籍/教程中建议的相同方案,则会产生以下网址:

/#/orders/1/show/items          // state: orders.show.items
/#/orders/1/show/items/create   // state: orders.show.items.create
/#/orders/1/show/items/2/show   // state: orders.show.items.show
/#/orders/1/show/items/2/edit   // state: orders.show.items.edit

但是:这些网址看起来不正确。那么,有哪些经验和建议?或者有什么建议可以获得一个干净的URL,从而获得一个干净的应用程序结构?

1 个答案:

答案 0 :(得分:0)

此外,我正在寻找类似问题的解决方案。到目前为止我得到的最好的是:

contacts (abstract, url: '/contacts')
contacts.list (url: '/', resolve: { contacts } )
contacts.new (url: '/new')

contacts.one (abstract, url: '/contacts/:id', resolve: { contact })
contacts.one.show (url: '')                         # => /contacts/1
contacts.one.edit (url: '/edit')                    # => /contacts/1/edit
contacts.one.addresses (abstract, url: '/addresses')
contacts.one.addresses.list (url: '', resolve: { user.addresses })
contacts.one.addresses.new (url: '/new')            # => /contacts/1/addresses/new

contacts.one.addresses.one (abstract, url: '/:id', resolve: { address })
contacts.one.addresses.one.show (url: '')           # => /contacts/1/addresses/1
contacts.one.addresses.one.edit (url: '/edit')      # => /contacts/1/addresses/1/edit