RESTful - 相同资源的不同URI,以获得不同形式的相同资源

时间:2013-05-19 17:58:06

标签: api rest uri restful-url restful-architecture

我陷入了一种奇怪的境地,我无法确定哪里出了问题,哪些是对的。

我有一个名为Invoice的资源。要获取JSON或XML表示,请使用以下URI

somedomain.com/inovices/{InvoiceNumber} - Invoice number is numeric
Accept: application/xml

当我想要一个相同资源的PDF时,我在URI下面使用:

somedomain.com/inovices/{InvoiceNumber} - Invoice number is numeric
Accept: application/pdf

以上网址均用于经过身份验证的请求。我们还希望使用GUID为未经身份验证的请求支持相同的资源,因此我们要使用以下URL

somedomain.com/inovices/{GUID}
Accept: application/pdf

以上网址就像一个永久网址,任何人都可以多次访问此网址。我的困惑在于提供上述URL是否是RESTful。因为在一个URL中我使用的是数字发票编号,对于永久URL,我用GUID替换它。

我觉得这是错误的原因是同一资源用两个不同的URI(数字和GUID)表示,即使它们返回相同的资源。或者只是我的假设是错的?反对任何REST cosntraint是我无法理解的吗?

1 个答案:

答案 0 :(得分:1)

所有不同的URI都指向同一资源没有问题。它不仅可以,有时它也是推荐的,如果这会增加用户的价值。

想想这些例子:

GET /api/users/543
GET /api/users/bob-marley

或者,如同那样:

GET /questions/16637720/restful-different-uri-of-same-resource-to-get-different-forms-of-same-resource
GET /q/16637720/1118323

到处都有类似的例子。如果要帮助用户或SEO,您可能希望添加此“无关紧要”信息,并仍保留短版本。或者想象一下senarios,您可能希望在不破坏现有资源的情况下添加更多访问资源的方法。这听起来很常见,你不会因为同一资源拥有多个URI而违反任何规则。

如果您担心某个用户可能会认为这两个资源不同,因为她使用了不同的URI,您可以将一个URI重定向到另一个,以明确表示它是完全相同的资源(就像您所做的那样)点击短链接,或没有线程标题的链接。

这是relevant answer