3

我们正在设计一个需要支持多种登录服务的 RESTFUL API。

Custom login:  ptgapi/v1/clients/{clientId}/users?mode=custom
FB login:      ptgapi/v1/clients/{clientId}/users?mode=facebook
Twitter login: ptgapi/v1/clients/{clientId}/users?mode=twitter
LinkedIn login: ptgapi/v1/clients/{clientId}/users?mode=linkedin
Create user:   ptgapi/v1/clients/{clientId}/users

我们在服务之上有一个 Spring Integration 层,因此根据提供的路径,需要激活其中一项服务。

想法是让路由器捕获入站网关输入并根据有效负载值重定向流。

<int-http:inbound-gateway id="v1.login.inbound.gateway" path="/ptgapi/{apiVersion}/clients/{clientId}/users" .../>

但是这里的“创建用户”具有与其他用户相同的路由过程……我认为这是一种难闻的气味。

是否有更好的方法来更好地分离关注点?

谢谢!

4

3 回答 3

1

服务可能具有相同的路径/路由,但它们由操作标识。在 REST 中,您将拥有相同的服务路径,但根据您正在执行的操作类型,HTTP 方法会有所不同。您可以使用 POST 和 PUT HTTP 方法区分您的登录并创建服务。

就个人而言,我认为 PUT 是一个更好的选择,因为 PUT 提供了更多控制权,例如:

  • 您是明确命名您创建的 URL 对象,还是让服务器决定?如果您命名它们,则使用 PUT。如果您让服务器决定然后使用 POST。
  • PUT 是幂等的,所以如果你 PUT 一个对象两次,它就没有效果。这是一个不错的属性,所以我会尽可能使用 PUT。
  • 您可以使用具有相同对象 URL 的 PUT 更新或创建资源

有关 PUT 与 POST 的更多信息

PUT意味着放置一个资源——用不同的东西完全替换给定 URL 上可用的任何东西。根据定义,PUT 是幂等的。你喜欢做多少次,结果都是一样的。x=5 是幂等的。您可以放置​​一个资源,无论它以前是否存在(例如,创建或更新)!

POST更新资源、添加辅助资源或导致更改。POST 不是幂等的,就像 x++ 不是幂等的一样。

于 2013-06-27T14:28:37.073 回答
1

对于用户 CRUD,您应该有一个类似ptgapi/v1/clients/{clientId}/users的路由,并使用它们应该使用的 HTTP 方法:GET用于返回用户,PUT用于创建用户,POST用于更新用户和删除以将其删除。

登录操作本身不是用户实体操作。您应该有另一条路线,就像ptgapi/v1/clients/login并通过 POST 传递登录参数(最好加密)。

于 2013-06-27T14:39:26.293 回答
0

创建用户是一个动作,所以也许你可以定义一个新的路线,比如

Create user:   ptgapi/v1/clients/{clientId}/users/new

或类似的东西。

于 2013-06-27T14:23:26.590 回答