为REST应用程序中当前登录用户设计URI

dur*_*dur 42 rest url http

我需要在REST API中使用URI来检索当前登录的用户.通常我GET在具有ID的资源上使用,但客户端不知道用户的ID.

我找到了以下解决方案:

  • 按用户名

    此解决方案使用用户名而不是用户的ID.

    例:

  • 拥有自己的资源

    此解决方案为用户提供了一个资源,为登录用户提供了一个额外资源.

    例子:

  • 带有符号链接

    该解决方案具有用户ID的符号链接.

    例:

  • 带过滤器

    此解决方案使用筛选器作为用户名.

    例:

哪一个最RESTful?优缺点都有什么?

cas*_*lin 30

由你决定.从REST的角度来看,所有方法都非常好.

根据Roy Thomas Fielding的论文*,任何可以命名的信息都可以是一种资源:

5.2.1.1资源和资源标识符

REST中信息的关键抽象是一种资源.可以命名的任何信息都可以是资源:文档或图像,临时服务(例如"洛杉矶的今天天气"),其他资源的集合,非虚拟对象(例如人)等等.换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义.资源是到一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体.[...]

当使用/me,/users/me,/users/myself,/users/current和同类者,您对定位器验证的用户,它总是识别的概念的的身份验证的用户,不管是哪个用户进行身份验证.

为了获得更大的灵活性,您也可以支持/users/{username}.

顺便说一下,类似的情况是在使用魔法(我/自己)资源标识符违反REST原则吗?


*如果您对REST感兴趣,那么Fielding的论文第5章是必读的.

  • @dur我会将用户名作为*path参数*而不是查询参数发送.正如我在[回答](http://stackoverflow.com/a/36421654/1426227)中提到的,在识别*特定实体*时应使用路径参数.例如,使用查询参数来过滤资源集合,控制分页和排序. (2认同)

Ami*_*til 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,usernameemail或任何其他唯一标识系统中用户的属性,那么,我们可以使用资源 uri ,例如,

GET- /users/current
Run Code Online (Sandbox Code Playgroud)

或者

GET- /users/me
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,客户端需要启用用户特定的令牌或会话,以便服务器可以从活动会话或标头中传递的令牌中找到用户。请注意,我们应该将此视为最后一个选择。