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

时间:2016-11-16 05:00:36

标签: rest server resteasy restful-architecture application-server

在API调用之间,通过私有int数组在服务器端存储StringList<>等值是安全/正确吗?例如,假设我的服务器代码具有方法methodA&amp; methodB其中methodA只计算两个Integer参数的平均值,返回结果,并将平均值添加到数组中。稍后,如果用户单击某个按钮,则会调用methodB并返回该数组的内容。

 @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设计吗?我对其他选择持开放态度。

相关:我假设这种方法只是在等待客户端请求时将数组值存储到内存中。它是否正确?在生产代码中我当然添加了一个数据库...但对于这样的小整数和字符串,我想知道服务器端内存是否足够/理想吗?

更新1:RPC over HTTP

我放弃了GET方法,因为仅POST方法可以通过JSON正文接受值并返回计算的平均值。这是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();

哪个正确返回{"Average: ":"600"}。显然我的生产代码更复杂并传递更多变量,这就是为什么我使用一个单独的容器类只有一个无参数构造函数和一堆getter / setter方法。这是现在的RESTful设计吗?

1 个答案:

答案 0 :(得分:1)

您的methodA不是RESTful,因为它修改了状态,averageList已更改。每次调用methodA/{val1}/{val2}后,系统的状态都会有所不同,这违反了REST原则。

您应该将计算存储两个数字的平均值分成两个 REST资源。

  • GET /main/api/average/{val1}/{val2}会计算平均值而不执行任何其他操作。不得更改服务器状态。
  • POST /main/api/averages在正文中有一个数字会将该数字追加到averageList