我正在使用 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.
哪个更干净:在此类中添加函数或创建一个新类?
该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)
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:使用此指示由于与目标资源的当前状态冲突而无法完成请求。