我需要在REST API中使用URI来检索当前登录的用户.通常我GET在具有ID的资源上使用,但客户端不知道用户的ID.
我找到了以下解决方案:
按用户名
此解决方案使用用户名而不是用户的ID.
例:
GET /user/{userSlug}拥有自己的资源
此解决方案为用户提供了一个资源,为登录用户提供了一个额外资源.
例子:
JIRA REST API:GET /myself
GitHub REST API:GET /user
Stack Exchange REST API:GET /me
带有符号链接
该解决方案具有用户ID的符号链接.
例:
GET /user/current带过滤器
此解决方案使用筛选器作为用户名.
例:
GET /user?username={username}哪一个最RESTful?优缺点都有什么?
cas*_*lin 30
由你决定.从REST的角度来看,所有方法都非常好.
根据Roy Thomas Fielding的论文*,任何可以命名的信息都可以是一种资源:
REST中信息的关键抽象是一种资源.可以命名的任何信息都可以是资源:文档或图像,临时服务(例如"洛杉矶的今天天气"),其他资源的集合,非虚拟对象(例如人)等等.换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义.资源是到一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体.[...]
当使用/me,/users/me,/users/myself,/users/current和同类者,您对定位器验证的用户,它总是识别的概念的的身份验证的用户,不管是哪个用户进行身份验证.
为了获得更大的灵活性,您也可以支持/users/{username}.
顺便说一下,类似的情况是在使用魔法(我/自己)资源标识符违反REST原则吗?
*如果您对REST感兴趣,那么Fielding的论文第5章是必读的.
I think REST URIs should uniquely identify the resource, no matter it' using userId/email/ssn or username, whichever attribute uniquely identify user in your system.
因此,资源可以是users(复数/users)并且为了使其单一,我们有以下选项,
如果客户有userId,资源应该是这样的,
GET - /users/{user-id}
Run Code Online (Sandbox Code Playgroud)
如果客户没有userId,但是有username,那么
GET - /users/{username}
Run Code Online (Sandbox Code Playgroud)
因此,只要 uri 唯一标识用户,我们就可以使用上述 uri 模式作为 REST 资源。
如果客户端没有userId,username或email或任何其他唯一标识系统中用户的属性,那么,我们可以使用资源 uri ,例如,
GET- /users/current
Run Code Online (Sandbox Code Playgroud)
或者
GET- /users/me
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,客户端需要启用用户特定的令牌或会话,以便服务器可以从活动会话或标头中传递的令牌中找到用户。请注意,我们应该将此视为最后一个选择。
| 归档时间: |
|
| 查看次数: |
13499 次 |
| 最近记录: |