Angularjs 以RESTful方式设置路线的最佳实践

Angularjs 以RESTful方式设置路线的最佳实践,angularjs,rest,crud,Angularjs,Rest,Crud,我正在使用AngularJS构建一个使用REST服务的UI: 这是服务器API /items/ GET /items/:id GET /items/ POST (to create new item) /items/:id PUT (to edit item) /items/:id DELETE 在Angular中设置路线时,最佳做法是什么?这些路由将映射到服务器RESTAPI,但显然存在问题。我猜我需要这个动作作为URL的一部分,对吗?大概是这样的: 角度路线: /items/ /items

我正在使用AngularJS构建一个使用REST服务的UI:

这是服务器API

/items/ GET
/items/:id GET
/items/ POST (to create new item)
/items/:id PUT (to edit item)
/items/:id DELETE
在Angular中设置路线时,最佳做法是什么?这些路由将映射到服务器RESTAPI,但显然存在问题。我猜我需要这个动作作为URL的一部分,对吗?大概是这样的:

角度路线:

/items/
/items/:id
/items/new 
/items/:id/edit
/items/:id/delete

然而,上述模式也有一个问题/items/new将同时匹配/items/:id和/items/new,因此在设置用于创建的路由时,最佳做法是什么?

使用UI路由器,我们可以设置客户端路由

请确保禁用html5路由,因为某些浏览器仍然不支持html5,并且它们使用服务器api而不是客户端路由

您可以通过设置
$locationProvider.html5Mode(false)来实现这一点app

/items/                     - this is for listing items
/items/{id:[0-9]{1,4}}      - this is for displaying one item in detail
/items/add                  - for displaying new item form
/items/:id/edit             - for displaying existing item in Form for editing
/items/:id/delete           - **This is not required, I mean you just hit the API when
                                use clicks delete, we cant show any deletion form**

您可以将regex用于params
'/items/{id:[0-9]{1,4}}
这意味着
只允许数字0到9
1到4个字符长

还要记住,您定义的客户端、角度路由可能取决于您的UI。您定义的路由更像是一个传统的web应用程序,您可以单击“添加新”按钮,进入一个新页面,该页面包含您填写的表单。但是,这可能不是您在单页应用程序(SPA)中使用的模式,因为它通常是使用Angular创建的

我的意思是,我所做的大多数SPA应用程序实际上在客户端没有独立的“/items/new”路由。相反,“/items/new”功能是在“/items/”路由/部分(“传统web应用术语中的页面”)上处理的。此页面列出了现有项目,您可以填写此页面上的表单以创建新项目。或者,在这个页面上有一个“添加新”按钮(就像传统的web应用程序一样);但是,单击它可以在模态表单中滑动,也可以单击ng显示已在/items/partial模板上定义(但最初隐藏)的表单

提交后,控制器点击服务器上的“POST/items/”以创建新项目,使用POST的返回值更新范围(假设成功,这将是新项目信息),并清除/重新隐藏“new”表单

底线——请记住,在SPA中,如果UI将新项作为项目列表页面的功能处理,则实际上可能不需要“/items/new”。当然,如果您需要将其作为可寻址端点的独立页面(即,您计划从多个位置链接到此页面,而不仅仅是从应用程序内部),那么您显然需要直接路由


在我们的例子中,我们通常不需要在我们的应用程序中为它指定路由,我们只需要将它作为“/items/”路由的一种功能进行服务。

您使用的是UI路由器吗?在UI路由器中,
items/new
items/:id
是两种不同的路由是的,我正在使用UI路由器。因此,如果用户在URL中键入/items/new,那么如果实际存在一个等于“new”的id呢?为什么要使用“new”作为id?为什么不使用id的
整数
UUID
?添加新项的路径对于所有的REST调用都是相同的,这取决于用户操作,对于post、get、get all、put、DELETE,您可以对参数使用regex
'/items/{id:[0-9]{1,4}“
这意味着只允许数字
0到9
1到4
字符。任何将“新建”更改为“添加”的特定原因?
为了可读性
项/add
可以很容易地理解为添加项,而像
项/new
创建
这样的词通常可以互换使用,事实上,它们是完全不同的:创建是指实例化一个全新的实例并第一次持久化它(比如注册一个新用户),添加是指获取一些东西(可能存在)并将它们放入某种集合(比如将用户添加到项目合作者)。可读性在这里不是一个强有力的论据。明白了,谢谢。但是,如果在我的情况下,我决定需要一个新视图(而不仅仅是现有页面中的弹出窗口),那么路由/项目/新的命名将不会违反REST约定,对吗?要清楚,REST约定通常应用于API路由,根据定义,需要方法来完全指定。在角度路由的情况下,您选择将REST设置为,但显然您没有方法,因此不会是REST。话虽如此,使用“/items/new”之类的东西肯定很常见。您只需在“命令”(即,该方法在实际REST场景中的作用)与有效ID之间消除歧义。这是Vamsi在另一个答案中解释得很好的。如果您的ID可以是alpha,那么您需要以另一种方式(例如/items/-new,如果ID中不允许破折号),将您的命令从ID命名空间中显式排除。