Java 设计API以使用Jersey启动和停止进程

Java 设计API以使用Jersey启动和停止进程,java,jersey,Java,Jersey,我正在用Java和Jersey开发一个RESTWeb服务器。这是我的第一个web应用程序,我希望确保我能够很好地构建应用程序。我创建了第一个运行良好的函数: @Path(“/startAuto”) 公休{ @得到 公共字符串startAuto(){ 试一试{ ProcessBuilder pb=新的ProcessBuilder(“/startAuto.sh”); 进程p=pb.start(); p、 waitFor(); 返回(“自动启动”); }捕获(例外e){ e、 printStackTr

我正在用Java和Jersey开发一个RESTWeb服务器。这是我的第一个web应用程序,我希望确保我能够很好地构建应用程序。我创建了第一个运行良好的函数:

@Path(“/startAuto”)
公休{
@得到
公共字符串startAuto(){
试一试{
ProcessBuilder pb=新的ProcessBuilder(“/startAuto.sh”);
进程p=pb.start();
p、 waitFor();
返回(“自动启动”);
}捕获(例外e){
e、 printStackTrace();
返回(“错误”);
}
}
}
我想添加一个新函数,如
stopAuto


哪个更干净:在这个类中添加函数还是创建一个新类

正如peeskillet在他的评论中指出的,这取决于您想要如何构造URL

如果你想要像这样的东西

/自动/启动和

/自动/停止

我会在一节课上全力以赴,结构如下

@Path("/auto") 
public class Rest {

    @GET
    @Path("/start")
    public String startAuto() {

    }

    @GET
    @Path("/stop")
    public String stopAuto() {

    }
}

良好的结构对于任何好的项目/产品都是必不可少的,但这也是一个问题,其答案因情况而异。 然而,如果有疑问,一个好的起点是按照“职责”对端点进行分组。如果它们属于同一类,那么就把它们放在同一个类中


个人观点:边界控制实体是我能找到的启动项目的最简单起点。然后根据需要调整结构。更多想法,请看亚当·宾的文章

通常,最好将另一个与当前资源相关的函数放在同一个类中

但您还应该记住,REST使用的是资源,而不是函数(名词,而不是动词)。因此,让API更加RESTfull可能是有意义的:

  • 您的目标资源这是一个自动。因此可以通过URL“/auto”访问它
  • 函数“启动”和“停止”用于更改资源的状态。所以,这意味着您有一个auto的“子资源”,可以通过URL“/auto/state”访问该子资源,并带有可能的值,例如“started”、“stopped”。此值可通过GET:/auto/state访问
  • 现在,可以使用PUT/POST请求和正文中的状态值来更改REST样式的状态(也可以使用PATCH方法来部分更新auto)。可能,在您的情况下,只保留一个方法作为端点公开是有意义的,该端点使用状态值和调用逻辑来根据参数启动或停止自动
  • 方法1 该方法应用于检索信息。不要使用更改资源的状态。相反,我更喜欢

    因此,您将获得以下内容:

    • 启动流程:
    POST/auto/start HTTP/1.1
    主持人:example.org
    
    • 停止进程:
    POST/auto/stop HTTP/1.1
    主持人:example.org
    
    使用此方法,您的资源类中将包含以下内容:

    @Path(“/auto”)
    公休{
    @职位
    @路径(“/start”)
    公共字符串开始(){
    ...
    }
    @职位
    @路径(“/stop”)
    公共字符串停止(){
    ...
    }
    }
    
    方法2 REST与协议无关,是一种体系结构。例如,当通过HTTP协议实现REST应用程序时,资源由URI标识,对资源的操作由URI表示

    使用这种方法,例如,资源的新状态将使用JSON在请求负载中表示。要获取资源的状态,请使用;要替换资源的状态,请使用

    您可以拥有以下内容:

    • 启动流程:
    PUT/auto/status HTTP/1.1
    主持人:example.org
    内容类型:application/json
    {
    “值”:“已启动”
    }
    
    • 停止进程:
    PUT/auto/status HTTP/1.1
    主持人:example.org
    内容类型:application/json
    {
    “值”:“已停止”
    }
    
    • 获取进程的状态:
    GET/auto/status HTTP/1.1
    主持人:example.org
    
    您的资源类如下所示:

    @Path(“/auto/status”)
    @使用(MediaType.APPLICATION_JSON)
    @产生(MediaType.APPLICATION_JSON)
    公休{
    @放
    公共字符串更改状态(状态状态){
    ...
    }
    @得到
    公共状态getStatus(){
    ...
    }
    }
    
    这就是
    Status
    类的外观:

    公共类状态{
    私有字符串值;
    //默认构造函数,省略了getter和setter
    }
    
    响应状态代码 您当然需要将操作结果告知您的客户。要做到这一点,请使用

    一些可能有用的状态:

    • :使用此状态表示请求已成功
    • :使用此状态代码表示已接受处理请求,但处理尚未完成
    • :使用此状态代码表示服务器已成功完成请求,并且响应有效负载正文中没有要发送的其他内容
    • :Use这表示由于与目标资源的当前状态冲突,请求无法完成

    这取决于您想要的端点路径。答案不错,但我认为按“责任”分组比按URL分组要好得多。这将确保相关逻辑彼此接近。虽然在理想情况下,URL也应该按照功能/职责进行分类,我同意这一点,但对于这样一个小例子,很难确定任何负责的边界在哪里。