我正在开发一个数据密集型的网络服务。 不幸的是,所有调用都不需要它返回的所有数据,但另一个调用可能需要它。
过于简化的响应可能如下所示:
Response : { A, B, C, D : { X : { } y, z } }
我想为调用者提供灵 active ,以便他们可以从大对象请求特定数据。 我想通过公开枚举并将枚举列表作为输入来实现它。每个枚举映射到响应中的一个字段。
如果调用者只需要 A 和 D,那么他们可以通过传递枚举列表来指定它,例如 ImmutableList.of(GET_ENUM_A, GET_ENUM_D) 在 Web 服务端我只能计算 A 和 D。
问题: 是否有更好的方法来获取调用者所需数据的输入(除了枚举)?
我想让用户控制更细粒度的数据,例如。他们可以指定需要 D 的哪一部分。 GET_ENUM_D_X。
在服务器端,我正在考虑使用命令模式来实现它,为每个枚举都有一个命令,并且仅当列表中存在相应的枚举时才执行它。
- 这里我的 D 将是一个门面。
- 如果请求粒度数据,则不要使用外观,而是使用 X 命令。
我能想到的问题:
- 我最终收到了太多命令。
- 如果一个命令是另一个命令的子集,并且两者都被请求仅执行超集命令(我们需要在代码中执行此操作)
有没有更好的方法来解决这个问题。
(PS:由于某些用例,我对将其分割为较小的 API 不感兴趣)。
最佳答案
如果您使用 Jackson 来序列化您的对象,您可以利用 View :
http://wiki.fasterxml.com/JacksonJsonViews
基本上,您定义一个 View 类,然后在序列化对象时,您将传入所需的 View 。例如:
// 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
}
}
然后,当你想要序列化时,你可以传入你想要的 View :
objectMapper.writeValueUsingView(out, beanInstance, A.class);
如果你想同时获得 a 和 c,你可以使用 AC 类
objectMapper.writeValueUsingView(out, beanInstance, AC.class);
关于java - 为数据密集型 Web 服务提供精细数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570672/