RESTful 漂亮的 URL 设计是关于显示基于结构的资源(类似目录的结构,日期:articles/2005/5/13,对象及其属性,..),斜线/表示层次结构,请改用-id。
#分层结构#
我个人更喜欢:
/garage-id/cars/car-id
/cars/car-id #for cars not in garages
如果用户删除 /car-id 部分,它会带来 cars 预览 - 直观。用户确切地知道他在树中的哪个位置,他在看什么。他从第一眼就知道,车库和汽车是相关的。 /car-id 也表示与/car/id 不同,它属于一起。
#搜索#
搜索查询没问题,只有您的偏好,应该考虑什么。加入搜索时会出现有趣的部分(见下文)。
/cars?color=blue;type=sedan #most prefered by me
/cars;color-blue+doors-4+type-sedan #looks good when using car-id
/cars?color=blue&doors=4&type=sedan #I don't recommend using &*
或者基本上任何不是如上所述的斜线的东西。
公式:/cars[?;]color[=-:]blue[,;+&], * 虽然我不会使用& 符号,因为乍一看从文本中无法识别。
** 你知道在 URI 中传递 JSON 对象是 RESTful 的吗? **
选项列表
/cars?color=black,blue,red;doors=3,5;type=sedan #most prefered by me
/cars?color:black:blue:red;doors:3:5;type:sedan
/cars?color(black,blue,red);doors(3,5);type(sedan) #does not look bad at all
/cars?color:(black,blue,red);doors:(3,5);type:sedan #little difference
##可能的功能?##
否定搜索字符串 (!)
要搜索任何汽车,但不是 黑色和红色:
?color=!black,!red
color:(!black,!red)
联合搜索
在车库中搜索 red 或 blue 或 black 门 3 门的汽车 id 1..20 em> 或 101..103 或 999 但不是 5
/garage[id=1-20,101-103,999,!5]/cars[color=red,blue,black;doors=3]
然后,您可以构建更复杂的搜索查询。 (查看CSS3 attribute matching 了解匹配子字符串的想法。例如搜索包含“bar”的用户user*=bar。)
#结论#
无论如何,这对你来说可能是最重要的部分,因为你可以随心所欲地做,只要记住 RESTful URI 代表一个易于理解的结构,例如类似目录的/directory/file、/collection/node/item、日期/articles/{year}/{month}/{day}.. 当你省略任何最后一段时,你会立即知道你得到了什么。
所以..,所有这些字符都允许未编码:
- 未保留:
a-zA-Z0-9_.-~
通常允许编码和不编码,然后两种用法是等效的。
- 特殊字符:
$-_.+!*'(),
- 保留:
;/?:@=&
可以未编码用于它们所代表的目的,否则必须对其进行编码。
- 不安全:
<>"#%{}|^~[]`
为什么不安全以及为什么应该编码:RFC 1738 see 2.2
有关更多字符类,另请参阅RFC 1738#page-20。
RFC 3986 see 2.2
尽管我之前说过,这里有一个常见的分隔符区别,这意味着有些“是”比其他的更重要。
- 通用分隔符:
:/?#[]@
- 子分隔符:
!$&'()*+,;=
更多阅读:
层次结构:see 2.3、see 1.2.3
url path parameter syntax
CSS3 attribute matching
IBM: RESTful Web services - The basics
注意:RFC 1738 由 RFC 3986 更新