关于RESTful URI的更多问题

时间:2011-02-20 20:13:16

标签: rest

数字ID与名称

例如,您可以选择从单个银行帐户中为单个公司识别单个交易中的哪一个:

  1. /企业/ FREDS绘画-LTD /账户/储蓄/交易/ 4831
  2. /企业/ FREDS绘画-LTD /账户/ 1 /交易/ 4831
  3. /公司/ 62362 /帐户/ 1 /交易/ 4831
  4. 你这个白痴,完全不同的东西! Crikey,你有没有阅读菲尔丁的论文?
  5. 现在,我认为第一个是最具可读性的。如果我有一家以上的公司,或者我是一个像会计师这样管理多家公司的人,我会立即清楚看到哪家公司和哪个账户。它也更易于收藏/可通过电子邮件发送,并且可以通过更改公司ID来阻止其他公司“钓鱼”。我希望交易ID对于一个账户是唯一的(即,'储蓄'和'当前'账户都可以有交易'1'

    “公司”将是我的“顶级”或“头等”资源。公司之间永远不会分享任何东西。因此,它将成为分片(或Google App Engine用语中的“祖先'/'命名空间)的理想候选者。因此,我只需要担心帐户名称在一家公司中是唯一的。每家公司都可以拥有一个名为“储蓄”的账户。

    不确定世界其他地方的情况是什么,虽然英国的LTD或PLC有一个独特的名称,但可能会有很多'Dave's Window Cleaning'业务(知道什么是交易名称)。

    企业所有者可能会选择将顶级/公司/公司名称URI公开,并包含一些基本详细信息,例如他们的网站,联系方式等,但是下面的所有内容都不会被搜索访问引擎。

    所以我的想法/顾虑是:

    1)当有人登录加入他们的业务时说“对不起,戴夫的窗户清洁”业务是否合理。戴夫的窗户清洁朴茨茅斯怎么样?(他们在另一个领域占据了他们的位置)?我担心的是,对于一个更知名的公司,你会放弃他们拥有一个帐户的事实。或者有人可以使用该表格来搜索姓名。也许不是一个大问题。

    2)公司名称的大小。像'戴夫的窗户清洁,园艺和其他东西'这样的名字是否合理?因此,创建一个像'daves-window-cleaning-gardening-and-load-of-other-stuff /'的网址

    3)如何处理更改商家名称的人 - 我会通过创建一个包含该字符串ID的新公司,复制所有内容,然后删除旧资源来实现它。原始URI将返回404而不是重定向 - 因为您不能保证其他人不会想要使用现在未使用的名称,或者即使过去有多个人使用相同的名称。

    4)“真实”唯一ID是否应该是后端的数字,并且对于每个请求,首先要查询该名称实际与之相关的公司ID。

    5)在持久层中搜索事务的影响。

    6)URL重写的可能性,但在GAE中不能干净利落,也不能解决确保公司名称独有的问题。

    RESTful webservice vs RESTful网站

    所以,我们可能有这个可爱的RESTful网络服务,最新的时髦的iphone / android应用程序可以使用(妄想的妄想)。但主网站本身呢?我现在注意到,我在页面顶部看到的URL不是“RESTful”:/ questions / ask是一个动作。服务器上没有“ask”资源。更多的是页面的状态,POST到/ questions /的准备 - 或者如果我正在编辑,请转到/ questions / {id}

    我还注意到Stackoverflow有像/ questions / 362352 / name-of-the-question这样的URI,后面的部分可以省略,一个会重定向到它。

    我应该托管一个完全独立的网络应用程序来消耗我可爱的网络服务(来自同一个域)吗?我是否需要一个单独的REST服务器,或者我可以依靠内容协商(JSON / XML)和HTTP动词来选择正确的方法(我正在使用Jersey),并返回正确的表示形式?

    所以我可以让/ companies / aboxo /返回整个HTML页面(使用stringtemplate.org),如果它是GET / ,text / plain或test / html,以及其他人的JSON / XML ?

    但是“添加/编辑/删除”交易会发生什么?将GET / / companies / freds-painting-ltd / savings / transactions /?template = add be ok(或GET ../transactions/352?template=edit),这将返回正确的HTML?

    考虑到这最后的细节让我生气了。

    评论,建议,彻底嘲笑 - 欢迎所有人!

    马科斯

2 个答案:

答案 0 :(得分:0)

Rails通过在URL中显示两者来解决“id vs name”问题,但仅使用id来实际识别,例如:

/companies/62362-freds-painting-ltd/accounts/1-savings/transactions/4831

ie - 对于那些有“漂亮网址”的人来说,生成你的路径的函数会同时写下id和名字......但是对于你的路由器,相关的是:你剥掉了所有不是id的东西。

顺便说一下,这意味着您的客户实际上可以将任何他们喜欢的内容写入网址,并且没有任何区别:

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

你的路由器仍然只看到:

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

:)

答案 1 :(得分:0)

对于一个规范的URI我建议只/transactions/{id}因为我认为交易知道公司和帐户是什么。因此,#4: - )

SEO是一个问题吗?我认为你不希望随机的人离开互联网谷歌搜索X公司的交易?!因此,我只会将名称(可能会更改)保留在URI之外。