Java RESTful web服务中的URL是否可以为具有不同授权级别的用户执行不同的操作?

Java RESTful web服务中的URL是否可以为具有不同授权级别的用户执行不同的操作?,java,rest,jakarta-ee,Java,Rest,Jakarta Ee,我正在创建一个RESTful Web服务,我有一个如下URL: GET /pets 对于普通用户,这应该只返回属于该用户的宠物。但是对于管理员,它应该返回系统中的所有宠物。这样做不对吗?还是我应该这样做 GET /pets?ownedBy=Smith 只有当用户是Smith或管理员时才允许访问宠物?我认为REST规范没有特别提到这方面的内容。但是IMPO,我相信根据请求用户返回结果是完全正确的。URL应尽可能保持干净。如果用户信息已经作为标题的一部分出现,那么就不需要在URL中重复提供它。我

我正在创建一个RESTful Web服务,我有一个如下URL:

GET /pets
对于普通用户,这应该只返回属于该用户的宠物。但是对于管理员,它应该返回系统中的所有宠物。这样做不对吗?还是我应该这样做

GET /pets?ownedBy=Smith

只有当用户是Smith或管理员时才允许访问宠物?

我认为REST规范没有特别提到这方面的内容。但是IMPO,我相信根据请求用户返回结果是完全正确的。URL应尽可能保持干净。如果用户信息已经作为标题的一部分出现,那么就不需要在URL中重复提供它。

我只会在URL中提供它,如果您也有将其他人的名字放在那里是有效的情况。例如,如果人们能够看到他们的朋友的宠物,或者如果和管理员能够看到选定的人的宠物

因此,在您拥有该参数的用户的情况下,公开它并始终使用它是有意义的

如果不是这样,那么API的简单性通常是一件好事


回答问题中的“可以”和“应该”——这是完全可能的。具体如何实现它将取决于您使用的框架,但它们都将支持这一点。

虽然Juned Ahsan的回答完全正确,但我可能会将您的URL模式修改为

GET/Smith/pets:为史密斯先生归还宠物


授权现在可以在URL的上一层完成,URL始终表示相同的资源。我倾向于选择此解决方案,因为在其上添加缓存层会更容易。将用户(从HTTP头)添加到缓存密钥效率不高,也不容易为某些缓存解决方案进行配置。

这两个URL是不同的

第一张是宠物的清单

第二个也给出了宠物列表,但在这种情况下,列表是由属性“所有者”过滤的。这没有什么错。我将第二个URL稍微更改为:

GET /pets?owner=Smith
这个URL的关键是,结果的类型是相同的(宠物实体的列表),含义也是相同的。只有一个筛选器应用于列表。这就是在REST中进行查询的地方

在某些情况下,路径参数会更好。如果您有实体“person”,它确实有一个宠物列表类型的属性,我会创建一个如下的路径

/<user>/pets
//宠物

如果pets列表是根元素,我将使用一个查询。

正如Christian Kuetbach前面提到的那样,使用REST传递参数,参数之间用/
i、 e.
//pets
如果您有任何其他特定于用户的功能,或者可以通过其他方式
/pets/
。我建议使用UUID作为用户ID—这样可以确保用户详细信息的安全性

我认为这取决于后端服务中的实现。目前,我正以类似的方式在WCF RESTful服务上工作(尽管是针对Android)。如果您有一些可以添加到数据库中的角色,那么在您的服务中应用这些角色并不困难,您的url与此无关

编辑:如果您确实想在URL中添加内容,您可以随时添加该内容。但我认为这根本没有必要。用户看到的越少越好