为数据密集型web服务提供细粒度数据



我正在开发一个真正的数据密集型web服务。不幸的是,它返回的所有数据并不是所有调用都需要,但可能在另一个调用中需要。

一个过于简化的回复可能看起来像下面这样:

<>之前响应:{一个,B,C,D: {X: {}y,z}}之前

我想为调用者提供灵活性,这样他们就可以从大对象请求特定的数据。我想通过暴露枚举来实现它,并将枚举列表作为输入。每个枚举映射到响应中的一个字段。

如果调用者只需要A和D,那么他们可以通过传递像immutableelist这样的枚举列表来指定它。(GET_ENUM_A GET_ENUM_D)在web服务端,我只能计算A和d。

问题:是否有更好的方法来输入(除了enum)调用者需要的数据?

我想让用户控制更细粒度的数据,例如:他们可以指定需要D的哪一部分。GET_ENUM_D_X .

在服务器端,我正在考虑使用命令模式实现它,对每个enum都有一个命令,只有在列表中存在相应的enum时才执行它。

  • 这里我的D将是一个立面
  • 如果请求粒度数据,那么不要使用facade,而是使用command for x。

我能想到的问题:

  • 命令太多了。
  • 如果一个命令是另一个命令的子集,并且两个命令都被请求,则只执行超集命令(我们需要在代码中这样做)

有更好的方法来解决这个问题吗?

(PS:由于某些用例,我对将其分割成更小的api不感兴趣)。

如果你正在使用Jackson来序列化你的对象,你可以利用视图的优势:

http://wiki.fasterxml.com/JacksonJsonViews

基本上,你定义一个视图类,然后当序列化对象时,你会传入你想要的视图。例如:

// View definitions:
class Views {
        static interface A { }
        static interface B { }
        static interface C { }
        static class AC implements A, C { }
}
public class Bean {
        @JsonView(Views.A.class) 
        public Object getA() {
          // compute A
        }
        @JsonView(Views.B.class) 
        public Object getB() {
          // compute B
        }
        @JsonView(Views.C.class) 
        public Object getC() {
          // compute C
        }
}

然后,当你想要序列化时,你可以传入你想要的视图:

objectMapper.writeValueUsingView(out, beanInstance, A.class);

如果想同时得到a和c,可以使用AC类

objectMapper.writeValueUsingView(out, beanInstance, AC.class);

最新更新