例如,您选择哪种方式来标识单个公司的单个银行账户中的单个交易:
1. /companies/freds-painting-ltd/accounts/savings/transactions/4831 2. /companies/freds-painting-ltd/accounts/1/transactions/4831 3. /companies/62362/accounts/1/transactions/4831 4. 傻瓜,完全不同的东西!天哪,你甚至读了Fielding的论文吗?
现在,我认为第一种方式最可读。如果我有多个公司,或者像会计这样管理多个公司,那么就可以立即清楚地了解我正在查看哪个公司和哪个账户。它还更方便书签/电子邮件,并且通过更改公司ID来防止“钓鱼”其他公司。我希望交易ID对于一个账户是唯一的(即“储蓄”账户和“流通”账户都可以有交易“1”)
“公司”将是我的“顶级”或“一级”资源。绝对不会在公司之间共享任何内容。因此,它将是碎片(或Google App Engine术语中的“祖先”/“命名空间”)的理想候选人。因此,我只需要担心账户名称在一个公司内是唯一的。每个公司都可以有一个名为“储蓄”的账户。
虽然英国的LTD或PLC公司将拥有唯一名称,但其他地区的情况我不确定。可能会有许多“戴夫的窗户清洁”这样的企业(被称为交易名称)。
企业所有者可以选择公开顶级/公司/公司名称URI,并包含一些基本详细信息,如其网站、联系方式等,但该URI以下的所有内容都永远不会被搜索引擎访问。
因此,我的想法/关注点是:
1) 当有人登录并添加他们的业务时,是否合理地说“对不起,'Dave's Window Cleaning'业务已被占用,怎么样尝试'Dave's Window Cleaning Portsmouth'(在另一个字段中获取他们的位置)?我担心的是,对于更知名的公司,您正在泄露他们与您拥有的帐户这一事实。或者某人可以使用该表单来搜索名称。也许这不是大问题。
2) 公司名称的大小。像'Dave's Window cleaning, gardening, and loads of other stuff'这样的名称合理吗?从而创建像'daves-window-cleaning-gardening-and-loads-of-other-stuff/'这样的URL?
3) 如何处理更改企业名称的人-我会通过创建一个新的具有该字符串ID的公司,复制所有内容,然后删除旧资源来处理它。原始URI将返回404而不是重定向-因为您无法保证其他人不想使用现在未使用的名称,甚至如果过去有多个人使用了相同的名称。
4) 后端的“真实”唯一ID应该是一个数字,并且每个请求都需要先查询这个名称实际关联到哪个公司ID。
5) 在持久层中搜索事务所产生的影响。
6) URL重写的可能性,但在GAE中无法完全解决公司名称必须唯一的问题。
RESTful webservice vs RESTful website
所以,我们有了一个漂亮的RESTful webservice,最新的时髦iphone/android应用程序可以使用它(华而不实)。但主网站呢?我注意到,现在我在页面顶部看到的URL不是“RESTful”的:/questions/ask是一个动作。服务器上没有“ask”资源。这更多是页面的状态,准备POST到/questions/,或者如果我正在编辑,则PUT到/questions/{id}
我还注意到Stackoverflow有像/questions/362352/name-of-the-question这样的URI,后半部分可以省略,也会被重定向到它。
我是否应该主机一个完全独立的webapp,它消费我的可爱的webservice(来自同一个域)?我是否需要一个单独的REST服务器,还是可以依靠内容协商(JSON/XML)和HTTP动词来选择正确的方法(我正在使用Jersey),并返回正确的表示?
所以,如果是GET /,text/plain或test/html,我可以返回整个HTML页面(使用stringtemplate.org)/companies/aboxo/,并为其他人返回JSON/XML?
但是对于“添加/编辑/删除”事务会发生什么情况呢?GET / /companies/freds-painting-ltd/savings/transactions/?template=add (或GET ../transactions/352?template=edit)是否可以,这将返回正确的HTML?
想到这个最后的细节让我发疯了。
欢迎评论、建议和直接嘲笑!
Marcos