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

use*_*881 3 java jersey

我正在使用 Java 和 Jersey 开发 REST Web 服务器。这是我的第一个 Web 应用程序,我想确保我很好地构建了该应用程序。我创建了第一个运行良好的函数:

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

    @GET
    public String startAuto() {
        try {
            ProcessBuilder pb = new ProcessBuilder("/startAuto.sh");
            Process p = pb.start();     
            p.waitFor();                
            return ("Auto Started");
        } catch (Exception e) {
            e.printStackTrace();
            return ("error");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想添加一个新功能,例如stopAuto.

哪个更干净:在此类中添加函数或创建一个新类?

cas*_*lin 5

方法一

GET方法应用于检索信息。不要用于GET更改资源的状态。POST更喜欢。

所以,你会得到如下内容:

  • 启动进程:
POST /auto/start HTTP/1.1
Host: example.org
Run Code Online (Sandbox Code Playgroud)
  • 停止进程:
POST /auto/stop HTTP/1.1
Host: example.org
Run Code Online (Sandbox Code Playgroud)

通过这种方法,您的资源类中将包含以下内容:

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

    @POST
    @Path("/start")
    public String start() {
        ...
    }

    @POST
    @Path("/stop")
    public String stop() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

方法2

REST 是独立于协议的,是一种面向资源的架构。例如,当通过HTTP协议实现REST应用时,资源由URI标识,对资源的操作由HTTP方法表示。

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

您可以拥有以下内容:

  • 启动进程:
PUT /auto/status HTTP/1.1
Host: example.org
Content-Type: application/json

{
   "value" : "started"
}
Run Code Online (Sandbox Code Playgroud)
  • 停止进程:
PUT /auto/status HTTP/1.1
Host: example.org
Content-Type: application/json

{
   "value" : "stopped"
}
Run Code Online (Sandbox Code Playgroud)
  • 获取进程的状态:
GET /auto/status HTTP/1.1
Host: example.org
Run Code Online (Sandbox Code Playgroud)

您的资源类将类似于:

@Path("/auto/status")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class Rest {

    @PUT
    public String changeStatus(Status status) {
        ...
    }
    
    @GET
    public Status getStatus() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是Status类的样子:

public class Status {

    private String value;
    
    // Default constructor, getters and setters omitted
}
Run Code Online (Sandbox Code Playgroud)

响应状态码

您当然需要通知您的客户操作结果。为此,请使用HTTP 响应状态代码

一些可能有用的状态:

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