这是方法 RESTful? [服务器端字段]

Is this Approach RESTful? [Server-Side Fields]

是否 safe/correct 通过私有 List<> 数组在服务器端存储 intString 等值,在 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.