RESTful URI的更多问题

3
数字ID与名称
例如,您选择哪种方式来标识单个公司的单个银行账户中的单个交易:
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


我知道这是一个有争议的问题,但是在银行账户的URL中拥有那么多信息让我感到不安。我知道每个关键点的每个层级都应该检查授权,但这是一个例外情况,我宁愿在查询字符串中有一个加密的、混淆的混乱作为额外的防线。 - Tim M.
感谢您的评论 - 有两件事情值得注意。首先,URL只会显示您公司在一个您命名的银行账户中拥有一个无意义的交易ID。他们将无法致电汇丰银行并使用该账户“名称”或交易ID。他们实际上不会进行交易 - 他们只是记录下来而已。其次,为了扩大问题的范围,也许可以将“交易”理解为“不太敏感的子资源”。 - Marcos Scriven
1
你可能会觉得Hanselminutes的“Misunderstanding REST”这一集很有趣:http://www.hanselminutes.com/default.aspx?showID=255。 - Aleksi Yrttiaho
谢谢 Aleksi - 在第17分钟时,当被问到关于RESTful风格最大的误解时,他提到了我在问题中询问的正是这两件事情。哦,天啊... - Marcos Scriven
2个回答

0
Rails通过在URL中同时显示id和name来解决“id vs name”问题,但只使用id来进行实际识别。
/companies/62362-freds-painting-ltd/accounts/1-savings/transactions/4831

例如,对于那些具有“美观URL”的功能,生成路径的函数会同时写入ID和名称...但对于您的路由器,在相关情况下:您会剥离掉除ID以外的所有内容。

顺便说一句,这意味着您的客户实际上可以在URL中编写任何他们喜欢的内容,而不会产生任何影响:

/companies/62362-i_luv_blue_turtles/accounts/1-your_mum/transactions/4831

而您的路由器仍然只能看到:

/companies/62362/accounts/1/transactions/4831

:)


0
对于规范化 URI,我建议使用/transactions/{id},因为我认为交易知道公司和账户是什么。 因此,第4项 :-)
SEO 是一个问题吗?我想你不希望来自互联网的随机人员在谷歌上搜索X公司的交易吧!因此,我会将名称(可能会更改)保留在 URI 之外。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接