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

Api RESTful-同一资源的不同URI,以获得同一资源的不同形式,api,rest,uri,restful-url,restful-architecture,Api,Rest,Uri,Restful Url,Restful Architecture,我被推到一个特殊的境地,我无法决定什么是错的,什么是对的 我有一个叫发票的资源。要获得JSON或XML表示,我使用以下URI somedomain.com/inovices/{InvoiceNumber} - Invoice number is numeric Accept: application/xml 当我想要相同资源的PDF时,我使用以下URI: somedomain.com/inovices/{InvoiceNumber} - Invoice number is numeric Ac

我被推到一个特殊的境地,我无法决定什么是错的,什么是对的

我有一个叫发票的资源。要获得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
以上两个url都用于经过身份验证的请求。我们还希望为未经验证的请求使用GUID来支持相同的资源,因此我们希望使用下面的URL

somedomain.com/inovices/{GUID}
Accept: application/pdf
上面的URL就像一个永久的URL,任何人都可以多次访问这个URL。我的困惑在于上面提供的URL是否是RESTful的。因为在一个URL中,我使用的是数字发票号,而对于永久URL,我将用GUID替换它


我认为这是错误的原因是,相同的资源用两个不同的URI(编号和GUID)表示,即使它们返回相同的资源。还是我认为这是错误的?它是否与任何REST冲突?我无法理解这一点。

在所有不同的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
到处都有类似的例子。如果要帮助用户,您可能需要添加此“unnessecary”信息,或者,并保持短版本可用。或者想象一下senarios,您希望添加更多访问资源的方式,而不破坏现有的方式。对我来说,这听起来很常见,对于同一个资源,有多个URI不会违反任何规则

如果您担心用户可能会认为这两个资源是不同的,因为她使用了不同的URI,那么您可以将一个URI重定向到另一个,以明确它是完全相同的资源(当您点击短链接或没有线程头的链接时也是如此)


下面是一个例子。

指向同一资源的所有不同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
到处都有类似的例子。如果要帮助用户,您可能需要添加此“unnessecary”信息,或者,并保持短版本可用。或者想象一下senarios,您希望添加更多访问资源的方式,而不破坏现有的方式。对我来说,这听起来很常见,对于同一个资源,有多个URI不会违反任何规则

如果您担心用户可能会认为这两个资源是不同的,因为她使用了不同的URI,那么您可以将一个URI重定向到另一个,以明确它是完全相同的资源(当您点击短链接或没有线程头的链接时也是如此)


这里有一个问题。

您当然可以使用不同的URL交付相同的文档。为什么不允许呢?我在现实世界的应用程序中多次看到过它,但我看不出它有任何逻辑上的错误。@dirkk谢谢你的确认,如果你记得的话,你能给我指一些URL吗?对不起,它们是内部客户项目。不能这样做。当然,您可以使用不同的URL交付相同的文档。为什么不允许呢?我在现实世界的应用程序中多次看到过它,但我看不出它有任何逻辑上的错误。@dirkk谢谢你的确认,如果你记得的话,你能给我指一些URL吗?对不起,它们是内部客户项目。不能那样做。