0

这可能更像是一个风格问题,但我对如何最好地设计 RESTful API 感到有些困惑。

假设我想提供以下 API 调用:

  • 获取/播放器
    • 返回当前玩家
  • 获取 /player/{id}
    • 返回指定玩家
  • 发布 /admin/player/{id}
    • 注册指定的 Player
  • 放置 /admin/player/{id}
    • 更新指定的 Player

正如您可能推测的那样,最后两个需要管理权限,而前两个只需要用户登录到系统。

所以我的问题涉及如何最好地将这个 API 放入资源中。我的第一直觉是创建一个没有类级别 @Path 注释的单个 PlayerResource ,而是使用@Path("player/...")@Path("admin/player/...")相应地定义每个方法。那会奏效吗?它对我来说有点味道,那么有没有更好的方法来做这种风格?我能想到的唯一选择是创建一个单独的资源类来包含仅限管理员的调用,但这对我来说也很臭,因为我有两个资源处理同一个模型类。

我只是在寻找一些关于如何最好地设计这个东西的指导。这是我的第一个 RESTful Web 应用程序,所以请原谅我可怕的无知。谢谢!

4

1 回答 1

1

我不会为管理员调用提供单独的资源。如果进行调用的用户无权 POST 或 PUT 到特定资源,请返回 401-Unauthorized 状态代码。在我看来,这是唯一正确和有意的做法。

评论后编辑:

正如您所提到的,您通过 web.xml 定义了安全约束,我猜您将拥有用户角色。

这将允许您执行以下操作:)

@PUT
@RolesAllowed("ADMIN")
public void register(User user){......)

您只需将https://jersey.github.io/apidocs/1.5/jersey/com/sun/jersey/api/container/filter/RolesAllowedResourceFilterFactory.html到位:)

编辑2

我的资源总是这样。(允许例外:))

@Path("/players")
public class PlayerResource{
  @GET
  public List<Player> list(){}

  @GET
  @Path("{id}")
  public Player get(@PathParam("id")Long id){}

  @DELETE
  @RolesAllowed("ADMIN")
  @Path("{id}")
  public Player delete(@PathParam("id")Long id){}

  //PUT and POST ommited

}

问候

于 2013-05-04T20:51:32.527 回答