Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAX-RS(Jersey)仅管理API调用_Java_Rest_Jersey_Jax Rs - Fatal编程技术网

Java JAX-RS(Jersey)仅管理API调用

Java JAX-RS(Jersey)仅管理API调用,java,rest,jersey,jax-rs,Java,Rest,Jersey,Jax Rs,这可能更像是一个风格问题,但我有点困惑于如何最好地设计RESTful API 假设我想提供以下API调用: 获得/玩家 返回当前播放机 获取/player/{id} 返回指定的播放机 POST/admin/player/{id} 注册指定的播放机 PUT/admin/player/{id} 更新指定的播放机 正如您可能猜测的那样,后两个需要管理权限,前两个只需要用户登录系统 因此,我的问题涉及如何最好地将此API部署到资源中。我的第一反应是创建一个PlayerResource

这可能更像是一个风格问题,但我有点困惑于如何最好地设计RESTful API

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

  • 获得/玩家
    • 返回当前播放机
  • 获取/player/{id}
    • 返回指定的播放机
  • POST/admin/player/{id}
    • 注册指定的播放机
  • PUT/admin/player/{id}
    • 更新指定的播放机
正如您可能猜测的那样,后两个需要管理权限,前两个只需要用户登录系统

因此,我的问题涉及如何最好地将此API部署到资源中。我的第一反应是创建一个PlayerResource,它没有类级别的@Path注释,而是使用
@Path(“player/…”)
@Path(“admin/player/…”)
相应地定义每个方法。这样行吗?我只是觉得有点难闻,所以有没有更好的方式来做这种风格呢?我能想到的唯一替代方法是创建一个单独的资源类来包含仅限管理员的调用,但这对我来说也很难闻,因为我有两个资源处理同一个模型类


我只是想找一点关于如何最好地设计这个东西的指导。这是我的第一个RESTful web应用程序,请原谅我的无知。谢谢

我不赞成为管理员调用提供单独的资源。 如果打电话的用户没有发布或放置到特定资源的权限,请返回401未授权状态代码。在我看来,这是做这件事的唯一正确和有意的方式

评论后编辑:

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

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

您只需将

编辑2

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

@Path(“/players”)
公共类PlayerResource{
@得到
公共列表(){}
@得到
@路径(“{id}”)
公共玩家获取(@PathParam(“id”)长id){}
@删除
@允许的角色(“管理员”)
@路径(“{id}”)
公共播放器删除(@PathParam(“id”)长id){}
//张贴
}

好吧,我意识到有一件事我没有提到。我正在尝试使用web.xml中的安全约束来保护admin/*路径中的所有内容。这一选择是否仍然可行?换句话说,我实际上并没有检查这些方法中的任何授权内容。我想这取决于谷歌应用引擎。也许这就是我犯新手错误的地方,但这似乎是GAE引导我的方式。检查编辑,应该可以通过注释。因此,您不需要在每个方法中都运行复杂的代码,您希望限制对这些方法的访问。因此,一般来说,不在类上定义顶级路径并在本例中多次重复@path(“/player/…”)是可以的?我想这是我的风格问题。非常感谢您的及时回复。真的帮助我学习!如果非管理员从不放置或发布,并且这些是唯一的管理员操作,请使用HTTP方法约束作为您的挂钩点。您真的应该阅读这篇文章,它帮助我获得了很多见解,并且是我的“休息方式”
@PUT
@RolesAllowed("ADMIN")
public void register(User user){......)
@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

}