这是方法 RESTful? [服务器端字段]
Is this Approach RESTful? [Server-Side Fields]
是否 safe/correct 通过私有 List<>
数组在服务器端存储 int
或 String
等值,在 API 调用之间?例如,假设我的服务器代码有方法 methodA
& methodB
,其中 methodA
只是计算两个 Integer 参数的平均值,returns 结果,并将平均值添加到数组。稍后,如果用户单击某个按钮... methodB
被调用并且 return 是该数组的内容。
@Path("main/api")
public class MainResource {
private List <int> averageList = new List<>();
@GET
@Path("methodA/{val1}/{val2}")
public Integer methodA(@PathParam("val1") final Integer val1,
@PathParam("val2") final Integer val2) {
Integer average = (val1 + val2) / 2;
averages.add(average);
return average;
}
@GET
@Path("methodB/")
public List <Integer> methodB() {
return averageList;
}
}
您能解释一下为什么这违反或不违反 RESTful 设计吗?我对其他选择持开放态度。
相关: 我假设这种方法只是在等待客户端请求时将数组值存储到内存中。这个对吗?在生产代码中,我当然会添加一个数据库……但是对于这么小的整数和字符串,我想知道服务器端内存是否是 sufficient/ideal?
更新 1:基于 HTTP 的 RPC
我已经放弃了 GET
方法,因为 POST
方法单独可以接受通过 JSON 主体和 return 计算平均值的值。这是RESTful吗?
@Path("main/api")
public class MainResource {
private List<Integer> averageList = new List<>();
private Integer val1;
private Integer val2;
private Integer average;
private Map<String, String> map;
@POST
@Path("methodA/")
@Consumes("application/json")
@Produces("application/json")
public Response performAverage(AverageData averageData) {
val1 = averageData.getVal1();
val2 = averageData.getVal2();
average = (val1 + val2) / 2;
averages.add(average); // <--- Modifies state
map = new HashMap<>();
map.put("Average: ", average);
return Response.ok(map).build();
}
}
ClientDemo.java
target = client.target("http://localhost:8080/NovaRest/rest/main/api/methodA");
String input = "{\"val1\":500,\"val2\":700}";
Response response = target.request().post(Entity.entity(input, "application/json"));
String value = response.readEntity(String.class);
System.out.println("POST RESPONSE: " + value);
response.close();
正确 returns {"Average: ":"600"}
。显然我的生产代码更复杂并传递更多变量,这就是为什么我使用单独的容器 class 只有一个 no-参数构造函数和一堆 getters/setters。这是现在的RESTful设计吗?
你的methodA
不是RESTful因为它修改了状态,averageList
被改变了。每次调用 methodA/{val1}/{val2}
后系统状态都会不同,这违反了 REST 原则。
您应该将两个数的平均值的计算和存储拆分为两个 REST资源。
GET /main/api/average/{val1}/{val2}
会计算平均值,什么都不做。不得更改服务器状态。
POST /main/api/averages
正文中有数字会将数字附加到 averageList
.
是否 safe/correct 通过私有 List<>
数组在服务器端存储 int
或 String
等值,在 API 调用之间?例如,假设我的服务器代码有方法 methodA
& methodB
,其中 methodA
只是计算两个 Integer 参数的平均值,returns 结果,并将平均值添加到数组。稍后,如果用户单击某个按钮... methodB
被调用并且 return 是该数组的内容。
@Path("main/api")
public class MainResource {
private List <int> averageList = new List<>();
@GET
@Path("methodA/{val1}/{val2}")
public Integer methodA(@PathParam("val1") final Integer val1,
@PathParam("val2") final Integer val2) {
Integer average = (val1 + val2) / 2;
averages.add(average);
return average;
}
@GET
@Path("methodB/")
public List <Integer> methodB() {
return averageList;
}
}
您能解释一下为什么这违反或不违反 RESTful 设计吗?我对其他选择持开放态度。
相关: 我假设这种方法只是在等待客户端请求时将数组值存储到内存中。这个对吗?在生产代码中,我当然会添加一个数据库……但是对于这么小的整数和字符串,我想知道服务器端内存是否是 sufficient/ideal?
更新 1:基于 HTTP 的 RPC
我已经放弃了 GET
方法,因为 POST
方法单独可以接受通过 JSON 主体和 return 计算平均值的值。这是RESTful吗?
@Path("main/api")
public class MainResource {
private List<Integer> averageList = new List<>();
private Integer val1;
private Integer val2;
private Integer average;
private Map<String, String> map;
@POST
@Path("methodA/")
@Consumes("application/json")
@Produces("application/json")
public Response performAverage(AverageData averageData) {
val1 = averageData.getVal1();
val2 = averageData.getVal2();
average = (val1 + val2) / 2;
averages.add(average); // <--- Modifies state
map = new HashMap<>();
map.put("Average: ", average);
return Response.ok(map).build();
}
}
ClientDemo.java
target = client.target("http://localhost:8080/NovaRest/rest/main/api/methodA");
String input = "{\"val1\":500,\"val2\":700}";
Response response = target.request().post(Entity.entity(input, "application/json"));
String value = response.readEntity(String.class);
System.out.println("POST RESPONSE: " + value);
response.close();
正确 returns {"Average: ":"600"}
。显然我的生产代码更复杂并传递更多变量,这就是为什么我使用单独的容器 class 只有一个 no-参数构造函数和一堆 getters/setters。这是现在的RESTful设计吗?
你的methodA
不是RESTful因为它修改了状态,averageList
被改变了。每次调用 methodA/{val1}/{val2}
后系统状态都会不同,这违反了 REST 原则。
您应该将两个数的平均值的计算和存储拆分为两个 REST资源。
GET /main/api/average/{val1}/{val2}
会计算平均值,什么都不做。不得更改服务器状态。POST /main/api/averages
正文中有数字会将数字附加到averageList
.