gpt4 book ai didi

java - 为数据密集型 Web 服务提供精细数据

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:26 49 4
gpt4 key购买 nike

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

过于简化的响应可能如下所示:

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/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com