API端点是否根据用户凭据RESTful和良好的URI设计区分要返回的资源?

API端点是否根据用户凭据RESTful和良好的URI设计区分要返回的资源?,rest,authentication,uri,restful-url,api-design,Rest,Authentication,Uri,Restful Url,Api Design,重要提示 这个问题的焦点是API端点,它根据身份验证者来区分返回哪些资源,例如Alice获取返回的资源A和B,Bob获取资源X和Y 它是而不是关于区分返回的资源的表示 所有端点都返回资源的JSON表示 前言 请考虑以下三个潜在的API端点设计,全部返回事物< /代码>用户资源。 端点A 如果请求中提供了的身份验证凭据,它将返回专门与相关的资源。 例如,验证用户Alice获得返回的资源A和B,验证用户Bob获得资源X和Y 因此,不同身份验证用户响应的区别在于返回了哪些资源实例,而不是返回了这些实例

重要提示

这个问题的焦点是API端点,它根据身份验证者来区分返回哪些资源,例如Alice获取返回的资源A和B,Bob获取资源X和Y

它是而不是关于区分返回的资源的表示

所有端点都返回资源的JSON表示

前言

请考虑以下三个潜在的API端点设计,全部返回<代码>事物< /代码>用户资源。

端点A

如果请求中提供了
的身份验证凭据,它将返回专门与
相关的
资源。
例如,验证用户Alice获得返回的资源A和B,验证用户Bob获得资源X和Y

因此,不同身份验证用户响应的区别在于返回了哪些资源实例,而不是返回了这些实例的哪些信息(即资源表示)

当身份验证失败时,将返回401响应

端点B

GET/user//things
终点C

GET/things/?user\u id=
端点B和C都提供了与
相关的
对象
资源实例,如果身份验证用户有权访问这些
对象
资源

返回的
对象
资源实例的表示形式(例如,返回的资源信息)可能因用户身份验证的不同而有所不同。例如,
或管理员用户可能会在每个资源实例上获得比具有有限访问权限的用户更丰富的数据

验证对
资源没有任何访问权限的用户将得到401响应

我的问题

我想回答以下问题:

1) 端点是一个宁静的端点吗

2) 端点A是否具有良好的URI设计

3) 端点B和C是RESTful的吗

4) 端点B和C是否具有良好的URI设计

我期待着你的回答。我还提供了以下信息,并将感谢您对此的反馈

谢谢大家!


-Freddy Snijder更新了2015年3月18日13:05 CET,在给出的问题和答案的评论中加入了反馈

宁静

从纯粹主义者的观点来看,没有一个端点是RESTful的。例如,问题没有说明响应是否包含指向资源的链接,这样客户端就可以检索资源,而不需要了解资源的URI是如何构造的。事实上,除了万维网本身之外,几乎没有在实践中定义的API可以被认为是RESTful的

那么,关于这些端点没有什么有用的说法吗?我想有。 我们可以讨论端点处理的无状态性和idem效力,这对可伸缩性很重要。我们可以讨论端点的安全性,这对安全性很重要

对于所有端点,您可以声明以下内容:

它是无国籍的吗

是的,用户身份验证凭据是应用程序状态的一部分,并且随每个请求一起发送,因此服务器需要知道的处理请求的所有信息(不保留状态)都在请求中。(完整状态已转移)

因为这些端点处理GET请求,所以它们是idem有效的吗

端点A):是的,因为对端点A的请求(包括用户身份验证凭据)应被视为一个整体:无论您使用相同的凭据重复相同的请求的频率有多高,您将始终获得身份验证用户的
资源

<>强>但是,如果只考虑URI,请求实际上是不理想的,因为响应根据所提供的凭证而改变。

端点B)和C):与A)类似,您将始终获得URI中提供的
资源的
内容,无论您重复的频率有多高

除此之外,仅考虑URI本身,请求也是idem有效的,您需要知道的关于请求的所有信息都在URI中,用户凭据只能更改返回的
内容
资源的表示,而不能更改返回的资源

因为这些端点处理GET请求,所以它们安全吗

是的,因为请求不会改变任何数据,也没有任何其他副作用

URI设计

尽管从纯粹的REST角度来看,URI设计被认为是不相关的,但在软件开发人员和API最终用户使用和处理URI设计的实际情况下,URI设计是相关的

端点A是否具有良好的URI设计

是和否。当这个URI对应用程序用户隐藏,并且不会被书签或共享时,这个设计就可以了。但是,当此URI向最终用户公开时,此URI的设计不是很好,因为当作为链接共享此URI时,收件人将看不到相同的数据,除非她作为同一用户进行身份验证

端点B和C是否具有良好的URI设计

是的,最终用户可以从语义上理解端点是关于什么的,并且URI可以在用户之间共享

因此,您可以选择只定义端点B和C,而不是定义所有三个端点,因为它们可以提供端点A可以提供的一切,而且从URL可以明显看出请求的内容

请让我知道你的想法。谢谢大家!

-弗雷迪·斯奈德

我修改了我的旧答案。我假设我们讨论的是web文档,所以
/things/1
GET /things
GET /user/<user_x>/things
GET /things/?user_id=<user_x>